Мне нужно преобразовать hex в десятичное число в VB.NET. Нашел несколько примеров в С#, но когда я попытался конвертировать в VB.NET, я не увенчался успехом. Пример шестнадцатеричного числа, которое я пытаюсь преобразовать, это "A14152464C203230304232323020572F544947455234352E".
Как преобразовать hex в десятичный с помощью VB.NET?
Ответ 1
Это 24-байтовое (192-битное) число; какое значение вы ожидаете?
Обратите внимание, что вы можете использовать Convert
, чтобы выполнить большую работу grungy здесь - например (на С#):
string hex = "A14152464C203230304232323020572F544947455234352E";
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length ; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2,2), 16);
}
Как вы получаете от raw
к числу, зависит от того, что, по вашему мнению, число...
Перевод Visual Basic с .NET Reflector (хотя "-1" выглядит странно):
Dim hex As String = "A14152464C203230304232323020572F544947455234352E"
Dim raw As Byte() = New Byte((hex.Length / 2) - 1) {}
Dim i As Integer
For i = 0 To raw.Length - 1
raw(i) = Convert.ToByte(hex.Substring((i * 2), 2), &H10)
Next i
Ответ 2
Для шестнадцатеричных значений, для которых на самом деле не требуется класс bignum, вы можете использовать обычную функцию преобразования, но префикс числа с помощью "& H". VB интерпретирует "& H" в тексте, что означает "это шестнадцатеричное число", как и в коде.
dim n = Cint("&H" & text)
Ответ 3
Вы можете использовать функцию Val
в Visual Basic для преобразования шестнадцатеричного значения в десятичное значение. Это делается путем префикса строки "&H"
, чтобы сообщить Visual Basic, что это шестнадцатеричное значение, а затем преобразовать его в число.
Dim Value As Integer = Val("&H" & YourHexadecimalStringHere)
Ответ 4
Напишите один самостоятельно.
Вам нужно будет токенизировать строку, затем начать с правой стороны и проделать свой путь влево.
int weight = 1;
While Looping
{
If (token(i) == "F") { DecimalValue += 15 * weight; }
If (token(i) == "E") { DecimalValue += 14 * weight; }
If (token(i) == "D") { DecimalValue += 13 * weight; }
If (token(i) == "C") { DecimalValue += 12 * weight; }
If (token(i) == "B") { DecimalValue += 11 * weight; }
If (token(i) == "A") { DecimalValue += 10 * weight; }
else { DecimalValue += token(i) * weight; }
weight = weight * 16;
}
Что-то вроде этого.
Ответ 5
Dim hex As String
hex = "A14152464C203230304232323020572F544947455234352E"
Dim dec As Long
Dim hexpart As String
For x As Integer = 1 To (hex.Length / 2)
hexpart = hex.Substring((x * 2) - 2, 2)
dec = Int32.Parse(hexpart, System.Globalization.NumberStyles.HexNumber)
Debug.Print("Hex = " + hex + ",HexPart = " + hexpart + ", Dec = " + dec.ToString + Environment.NewLine)
Next
Это не будет работать для Decimal и Hex слишком длинный для целого числа... но вы получите эту идею. Вы можете разбить его и рекомбинировать.
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = A1, Dec = 161
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 41, Dec = 65
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 52, Dec = 82
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 46, Dec = 70
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 4C, Dec = 76
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 20, Dec = 32
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 42, Dec = 66
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 32, Dec = 50
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 30, Dec = 48
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 20, Dec = 32
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 57, Dec = 87
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 2F, Dec = 47
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 54, Dec = 84
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 49, Dec = 73
Hex = A14152464C203230304232323020572F544947455234352E,HexPart = 47, Dec = 71
Ответ 6
Private Function toByte(ByVal Shex As String) As List(Of Byte)
Const cvtCH As Integer = 2
Dim retval As New List(Of Byte)
Dim rmndr As Integer
rmndr = Shex.Length Mod cvtCH
If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c)
For x As Integer = 0 To Shex.Length - 1 Step cvtCH
retval.Add(Convert.ToByte(Shex.Substring(x, cvtCH), 16))
Next
Return retval
End Function
Private Function toU32(ByVal Shex As String) As List(Of UInt32)
Const cvtCH As Integer = 8
Dim retval As New List(Of UInt32)
Dim rmndr As Integer
rmndr = Shex.Length Mod cvtCH
If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c)
For x As Integer = 0 To Shex.Length - 1 Step cvtCH
retval.Add(Convert.ToUInt32(Shex.Substring(x, cvtCH), 16))
Next
Return retval
End Function
Private Function toU64(ByVal Shex As String) As List(Of UInt64)
Const cvtCH As Integer = 16
Dim retval As New List(Of UInt64)
Dim rmndr As Integer
rmndr = Shex.Length Mod cvtCH
If rmndr <> 0 Then Shex = Shex.PadLeft(Shex.Length + cvtCH - rmndr, "0"c)
For x As Integer = 0 To Shex.Length - 1 Step cvtCH
retval.Add(Convert.ToUInt64(Shex.Substring(x, cvtCH), 16))
Next
Return retval
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'unsigned 32 bit max = FFFFFFFF
'unsigned 64 bit max = FFFFFFFF
'signed 32 bit max = 7FFFFFFF
'signed 64 bit max = 7FFFFFFF
Dim hexS As String = "A14152464C203230304232323020572F544947455234352E"
Dim hexS2 As String = "A14152464C203230304232323020572F54494745523435"
toByte(hexS)
toU32(hexS)
toU64(hexS)
End Sub
Ответ 7
Это преобразует вашу строку в массив байтов:
Dim hex As String = "A14152464C203230304232323020572F544947455234352E"
Dim len As Integer = hex.Length \ 2
Dim data(len - 1) As Byte
For i As Integer = 0 to len - 1
data(i) = Convert.ToByte(hex.Substring(i * 2, 2), 16)
Next
Ответ 8
Dim hex As String = "A1B2C3D4"
Dim int As Integer = Val("&H" & hex)
Ответ 9
Пробовал другие ответы, и это помогло мне:
Convert.ToInt32(yourHEXString, 16)