我在Android的Kotlin类中进行了这种转换:
val binary = "01000100000111001011011011100010111000110011010111010110"
val hexadecimal = BigInteger(binary, 2).toString(16)
这产生了441CB6E2E335D6
的预期价值。
现在我想在Visual Basic中重现这一点,我正在做这样的事情:
Dim binary = "01000100000111001011011011100010111000110011010111010110"
Dim hexadecimal = BigInteger.Parse(binary, 2).ToString("X")
哪个是生产0A7108304A751AFEC876F740BC1F2CB59772FB7C6C753E
。
我不是Visual Basic的专家,但从我研究的内容来看,我认为这是将二进制转换为十六进制的正确方法。我做错了什么?
您可以为表示位的字符串编写一个简单的解析器:
Dim sb As StringBuilder = New StringBuilder()
For pos As Integer = 0 To binary.Length - 8 Step 8
sb.Append(Convert.ToByte(binary.Substring(pos, 8), 2).ToString("X2"))
Next
Console.WriteLine(sb) will print "441CB6E2E335D6"
或者使用Module将扩展方法添加到字符串数据类型:
Imports System.Runtime.CompilerServices
Imports System.Text
Module modStringExtensions
<Extension()>
Public Function ToHexFromBits(ByVal Value As String) As String
If (Not (Value.Length Mod 8 = 0)) Then Throw New FormatException("Invalid string length")
Dim sb As StringBuilder = New StringBuilder()
For pos As Integer = 0 To Value.Length - 8 Step 8
sb.Append(Convert.ToByte(Value.Substring(pos, 8), 2).ToString("X2"))
Next
Return sb.ToString()
End Function
End Module
然后使用扩展将位字符串转换为HEX表示:
Dim result As String = binary.ToHexFromBits()
以下代码是c#,但可能不太难将其转换为vb.net。
string BinToHex(string value)
{
var res = new char[(int)(value.Length / 4)];
int j = res.Length-1;
for (int i = value.Length - 1; i > 0; i -= 4)
{
int x = ((int)value[i]-48)
+((int)value[i-1]-48)*2
+((int)value[i-2]-48)*4
+((int)value[i-3]-48)*8;
res[j--] = x.ToString("X")[0];
}
return new string(res);
}
注意:它不会处理没有正确位数(4的倍数)的输入。无论如何,我们的想法是你可以在不使用基数10的情况下在base 2和base 16之间进行转换。你甚至可以从左向右步进。