конвертировать biginteger в шестнадцатеричную строку? выкидывает исключение, почему? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь преобразовать число в массиве переменных publickey в число Hex. код HEX_key = Hex(publickey(0)) выдает ошибку:

System.ArgumentException: «Аргумент« Число »не может быть преобразован в тип« BigInteger ». '

Как мне исправить это? Как мне преобразовать BigInteger в шестнадцатеричную строку?

public key is "-31969172801463260124234214026687674925736772420938592197321821673909885626448"

Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click

     Dim publickey() As BigInteger
    Dim HEX_key As String = Nothing
    publickey = EccMultiply(GENPOINT, Privatekey)
    HEX_key = Hex(publickey(0))
    TextBox11.Text = HEX_key

End Sub

PS: EccMultiply() - это функция, которая дает значение "-31969172801463260124234214026687674925736772420938592197321821673909885626448", которое я упомянул выше, переменная publickey имеет значение сейчас, так что publickey = (that big number). Function EccMultiply(genpoint, ScalarHex). Я не включил здесь код функции, поскольку он сделает код длинным. и Hex() равно "Imports System.Numerics"

1 Ответ

0 голосов
/ 15 апреля 2020

Вы неправильно интерпретируете сообщение об ошибке. Это не говорит о том, что аргумент является значением, которое нельзя преобразовать в значение BigInteger. Это говорит вам, что Hex не поддерживает тип BigInteger. В документации говорится, что перегрузка с параметром Object принимает «Любое допустимое числовое выражение c или строковое выражение» , но это означает любой из стандартных числовых типов c. Hex не понимает BigInteger. Я думаю, что ваш лучший вариант - преобразовать массив BigInteger в Byte и затем преобразовать его в шестнадцатеричное самостоятельно.

Вот метод расширения, который преобразует BigInteger в шестнадцатеричный String :

Imports System.Numerics
Imports System.Runtime.CompilerServices

Public Module BigIntegerExtensions

    <Extension>
    Public Function ToHexadecimal(source As BigInteger) As String
        Dim data = source.ToByteArray()

        Return String.Concat(data.Reverse().Select(Function(b) b.ToString("X2")))
    End Function

End Module

Вот пример использования:

Imports System.Numerics

Module Module1

    Sub Main()
        Dim n = 123456789
        Dim b = New BigInteger(n)

        Console.WriteLine(n.ToString("X"))
        Console.WriteLine(b.ToHexadecimal())

        Console.ReadLine()
    End Sub

End Module

Вы заметите, что в этом примере второй выход имеет начальный «0», которого не хватает первому выходу. Это потому, что каждый Byte преобразуется в две шестнадцатеричные цифры, поэтому на выходе всегда будет четное число цифр. Если вы не хотите этого, вы можете либо вызвать TrimStart на выходе, либо вы можете обработать байт старшего порядка по-другому:

Imports System.Numerics
Imports System.Runtime.CompilerServices

Public Module BigIntegerExtensions

    <Extension>
    Public Function ToHexadecimal(source As BigInteger) As String
        Dim data = source.ToByteArray()

        Array.Reverse(data)

        Return String.Concat(data.Skip(1).
                                  Select(Function(b) b.ToString("X2")).
                                  Prepend(data(0).ToString("X")))
    End Function

End Module
...