Преобразовать двоичную строку в шестнадцатеричную строку - PullRequest
1 голос
/ 06 марта 2019

У меня есть это преобразование в моем классе Kotlin для Android:

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 ]

2 голосов
/ 06 марта 2019

Вы можете написать простой парсер для строки, представляющей биты:

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()
0 голосов
/ 06 марта 2019

Следующий код - 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). В любом случае, идея заключается в том, что вы можете переводить между основанием 2 и основанием 16 без использования основания 10. Вы можете даже шагать слева направо.

...