Prat142 Ответов: 2

Преобразование двоичного кода в шестнадцатеричный


У меня есть следующий код:: я получаю исключение аргумента Out of Range для исключения массива и формата, которое я уже обработал::как можно улучшить код, чтобы устранить эти исключения?

Моя входная строка-это 128-битная двоичная строка, которую мне нужно преобразовать в 16-байтовое шестнадцатеричное значение.
var numOfBytes = (int)Math.Ceiling(line.Length / 8m);
                    var linebytes = new byte[numOfBytes];
                    var lenth = 8;

                    for (int j = 1; j <= numOfBytes; j++)
                    {
                        var startIndex = line.Length - 8 * j;
                        if (!int.TryParse(line, out lenth))
                        {
                            Console.WriteLine("{0} is non parsable character at the end of the string", line);
                        }
                        if (startIndex < 0)
                        {
                            lenth = 8 + startIndex;
                            startIndex = 0;
                        }
                        

                        string sub = line.Substring(startIndex, lenth);
                        linebytes[numOfBytes - j] = Convert.ToByte(sub, 2);


Что я уже пробовал:

Код, который я попробовал, находится в описании.

Patrice T

Можете ли вы показать пример ввода и вывода ?

2 Ответов

Рейтинг:
2

Richard MacCutchan

Чтобы преобразовать любой массив байтов в шестнадцатеричную строку вам просто нужно:

StringBuilder hexString = new StringBuilder();
for (int i = 0; i < byteArray.Length; ++i)
{
    hexString.Append(string.Format("{0:X2}", byteArray[i]));
}


Рейтинг:
0

User 7429338

Что такое линия.Длина? Это кратно 8?

numOfBytes округляется вверх от линии.Длина/8, что означает, что numOfBytes * 8 может быть больше строки.Длина.
В конце вашего цикла startIndex = line.Длина - 8 * numOfBytes, что может быть меньше 0.
линия.Подстрока(значение параметра startindex, длина) будет бросать исключение ArgumentOutOfRange.


Prat142

Да, линия.длина = 128 ..она всегда будет кратна 8