Вы неправильно интерпретируете сообщение об ошибке. Это не говорит о том, что аргумент является значением, которое нельзя преобразовать в значение 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