Как преобразовать строку в шестнадцатеричное в VB.NET?
Как мне преобразовать строку из текстового поля в шестнадцатеричное?
Я нашел только пути в C#. Есть ли у VB.NET такая возможность? Если это возможно, то я хотел бы знать, как преобразовать строку в шестнадцатеричное и шестнадцатеричное в строку.
7 ответов
Dim val As String
val = "10"
Dim hexVal As Integer
hexVal = Convert.ToInt32(val, 16) //16 specifies the base
Console.WriteLine(hexVal)
Это отобразит 16, которое является целочисленным эквивалентом шестнадцатеричной строки "10".
Вы можете легко преобразовать целое число в шестнадцатеричное число, выполнив:
Convert.ToInt32(15, 16)
И чтобы преобразовать его обратно в целое число, вы можете сделать:
Integer.Parse("15f", System.Globalization.NumberStyles.HexNumber)
Public Function StrToHex(ByRef Data As String) As String
Dim sVal As String
Dim sHex As String = ""
While Data.Length > 0
sVal = Conversion.Hex(Strings.Asc(Data.Substring(0, 1).ToString()))
Data = Data.Substring(1, Data.Length - 1)
sHex = sHex & sVal
End While
Return sHex
End Function
Пробовал и проверял код
Создайте эту функцию, скопировав ее.
Function StringToHex(ByVal text As String) As String
Dim hex As String
For i As Integer = 0 To text.Length - 1
hex &= Asc(text.Substring(i, 1)).ToString("x").ToUpper
Next
Return hex
End Function
Используйте это так
Debug.WriteLine(StringToHex("sim0n"))
Чтобы преобразовать в шестнадцатеричное, используйте Convert.ToInt32(val, 16)
, Convert.ToInt32 поддерживает ограниченные базы, 2, 8, 10 и 16.
Чтобы конвертировать в любую базу, используйте:
Public Shared Function IntToString(value As Integer, baseChars As Char()) As String
Dim result As String = String.Empty
Dim targetBase As Integer = baseChars.Length
Do
result = baseChars(value Mod targetBase) + result
value = value / targetBase
Loop While value > 0
Return result
End Function
Вышеуказанная функция исходит из этого вопроса. Преобразование C# в VB было сделано с использованием этого.
Короткое и эффективное выражение для отображения всех символов строки s
в шестнадцатеричной форме можно написать с помощью LINQ:
String.Join(" ", s.Select(Function(c) Conversion.Hex(AscW(c)).PadLeft(4, "0")).ToArray()))
Пример:
Для строки ► fix
это дает строку 25BA 0020 0066 0069 0078
,
Наслаждайтесь!
Пожалуйста, имейте в виду, что это Unicode-совместимый, возвращающий четырехзначное шестнадцатеричное значение для каждого символа, потому что старый обычный не-Unicode ASCII мертв, и вы больше не должны полагаться на него в любом приложении.
По моему скромному мнению, код Тилака кажется нормальным, но это не так.
Округление значения / targetBase дает слишком большие результаты.
Используя Fix(), получаемые целые числа будут такими, какими они должны быть.
Я благодарю Тилака за то, что он нашел такое изящное решение вопроса.
В сопроводительном коде я покажу, как легко проверять такие функции, как Int ToString.
Ожидаемое сообщение в окне сообщения:
Старые результаты:
0 1 10 101 100 101 1010 1001 1000 1001 1010
0 1 1X 10 11 1XX 1X0 1X1 10X 100 101
0 1 X 1y 10 11 XX Xy X0 X1 XX
0 1 X 1y 1z 10 11 1X Xy Xz X0
Новые результаты:
0 1 10 11 100 101 110 111 1000 1001 1010
0 1 X 10 11 1X X0 X1 XX 100 101
0 1 X y 10 11 1X 1y X0 X1 XX
0 1 X yz 10 11 1X 1y 1z X0
Новые результаты лучше ИМХО.
Public Sub test()
Dim numberCharacters As String = "01Xyz"
Dim messageText As String = "The old results are;" & vbNewLine
For loopCount As Integer = 1 To 2
If loopCount = 2 Then messageText &= "The new results are;" & vbNewLine
For baseLength As Integer = 2 To 5
Dim baseCharacters As Char() = _
Strings.Left(numberCharacters, baseLength).ToArray
For integerValue As Integer = 0 To 10
Dim resultText As String = _
Me.IntToString(integerValue, baseCharacters, loopCount = 2)
messageText &= resultText & " "
Next
messageText &= vbNewLine
Next
Next
Call MsgBox(berichtTekst & "The new results are better IMHO.")
End Sub
Public Function IntToString(value As Integer, baseChars As Char(), _
Optional newCode As Boolean = False) As String
Dim result As String = String.Empty
Dim targetBase As Integer = baseChars.Length
Do
result = baseChars(value Mod targetBase) & result
If newCode Then ' Improved code
value = Fix(value / targetBase)
Else ' Original code
value = value / targetBase
End If
Loop While value > 0
Return result
End Function
Надеюсь, это поможет другим.
У меня более 25 лет опыта работы программистом, в основном в RPG, Cobol, Synon, CL и Basic. Я также знаю некоторые Delphi, Pascal и C#. Я уверен, что смогу помочь этому сообществу.
Мне грустно, что я не могу комментировать ответы. Надеюсь, кто-то добавит мне несколько пунктов, так что теперь я могу легче помогать другим.
В связи с этим я добавляю свой комментарий к ответу Тилака от 8 мая 2012 года. Это первый и, надеюсь, единственный раз, когда я прибегаю к этому. Извините за это, но я не знаю другого пути.