c # шестнадцатеричное преобразование в бит - PullRequest
3 голосов
/ 28 февраля 2012

Я пытаюсь преобразовать шестнадцатеричное представление 64-разрядного числа (например, строка "FFFFFFFFF") в двоичное представление ("11111...").

Я пробовал

string result = Convert.ToString(Convert.ToUInt64(value, 16), 2);

но это приводит к сбивающей с толку ошибке компилятора:

Наилучшее совпадение перегруженного метода для 'System.Convert.ToString (object, System.IFormatProvider)' имеет несколько недопустимых аргументов

Аргумент 2: невозможно преобразовать из 'int' в 'System.IFormatProvider'

Ответы [ 5 ]

7 голосов
/ 28 февраля 2012

Что не так со следующим кодом?

string hex = "FFFFFFFFFFFFFFFF";

// Returns -1
long longValue = Convert.ToInt64(hex, 16);

// Returns 1111111111111111111111111111111111111111111111111111111111111111
string binRepresentation = Convert.ToString(longValue, 2);

В значительной степени то, что вы написали (только исправил приведение ulong к long), и возвращает то, что вы ожидаете.

Edit: Восстановите этот ответ, так как даже если представление long подписано, двоичное представление фактически соответствует ожидаемому.

3 голосов
/ 28 февраля 2012

Возможно, есть лучшее решение, но проверьте, работает ли оно:

public static string HexToBinary(string hexValue)
{
    ulong number = UInt64.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

    byte[] bytes = BitConverter.GetBytes(number);

    string binaryString = string.Empty;
    foreach (byte singleByte in bytes)
    {
        binaryString += Convert.ToString(singleByte, 2);
    }

    return binaryString;
}

Наиболее удобный способ - использовать Convert.ToString(Int64, Int32), но для ulong перегрузки нет. Другое решение - Convert.ToString(UInt64, IFormatProvider) и напишите свой собственный IFormatProvider. Просматривая примеры, я нашел IFormatProvider, который форматирует числа в двоичном, восьмеричном и шестнадцатеричном строковом представлении: http://msdn.microsoft.com/en-us/library/system.icustomformatter.aspx. Код выглядит очень похоже на то, что я предоставил, поэтому я думаю, что это неплохое решение.

1 голос
/ 07 марта 2013

Лучший выбор:

public static string hex2bin(string value)
        {
            return Convert.ToString(Convert.ToInt32(value, 16), 2).PadLeft(value.Length * 4, '0');
        }
0 голосов
/ 28 февраля 2012

Вот грубый подход, без ограничения 64-битного панси:

string HexStringToBinary(string hexString)
{
    var lup = new Dictionary<char, string>{
            { '0', "0000"},
            { '1', "0001"},
            { '2', "0010"}, 
            { '3', "0011"},

            { '4', "0100"}, 
            { '5', "0101"}, 
            { '6', "0110"}, 
            { '7', "0111"},

            { '8', "1000"}, 
            { '9', "1001"}, 
            { 'A', "1010"}, 
            { 'B', "1011"},

            { 'C', "1100"}, 
            { 'D', "1101"}, 
            { 'E', "1110"}, 
            { 'F', "1111"}};                

    var ret = string.Join("", from character in hexString
                              select lup[character]);
    return ret;
}
0 голосов
/ 28 февраля 2012

Если вы использовали this для преобразования шестнадцатеричной строки в BitArray, тогда задача создания двоичного представления является тривиальной:

BitArray barray = ConvertHexToBitArray(string hexData)
var sbuild = new StringBuilder();
for (int i = 0; i < barray.Length; i++)
{
    sbuild.Append(barray[i] ? "1" : "0");
}
Console.WriteLine(sbuild.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...