将二进制字符串转换为十六进制字符串

时间:2019-03-06 16:50:10

标签: vb.net kotlin binary hex

我在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的专家,但是根据我的研究,我认为这是将二进制转换为十六进制的正确方法。我在做什么错了?

2 个答案:

答案 0 :(得分:2)

您可以为表示位的字符串编写一个简单的解析器:

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"

或使用模块将扩展方法添加到字符串数据类型:

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()

答案 1 :(得分:0)

以下代码是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的情况下在基数2和基数16之间进行转换。您甚至可以从左移到右。