Преобразование байтового массива в шестнадцатеричное значение с использованием класса BitConverter в C#?

Я пытаюсь преобразовать byte array в hexadecimal значение с использованием класса Bitconverter.

long hexValue = 0X780B13436587;
byte[] byteArray = BitConverter.GetBytes ( hexValue );
string hexResult = BitConverter.ToString ( byteArray );

теперь, если я буду выполнять вышеупомянутый код построчно, это то, что я вижу

Я думал, что строка hexResult будет такой же, как hexValue (то есть 780B13436587h), но я получаю другое, я что-то упустил, поправьте меня, если я ошибаюсь.

Спасибо!

3 ответа

Решение

Порядок байтов.

BitConverter использует порядковый номер процессора, что для большинства людей означает: little-endian. Когда люди пишут числа, мы, как правило, пишем с прямым порядком байтов (в широком смысле: вы пишете тысячи, затем сотни, затем десятки, а затем цифры). Для ЦП, big-endian означает, что старший байт является первым, а младший - последним. Однако, если вы не используете Itanium, ваш процессор, вероятно, имеет младший порядок, что означает, что старший значащий байт является последним, а наименее значимый - первым. Процессор реализован таким образом, что это не имеет значения, если вы не заглядываете в необработанную память - это гарантирует, что числовая и двоичная арифметика будет работать так, как вы ожидаете. Тем не мение, BitConverter работает, заглядывая внутрь сырой памяти - следовательно, вы видите обратные данные.

Если вы хотите получить значение в формате с прямым порядком байтов, то вам необходимо:

  • сделать это вручную в порядке с прямым порядком байтов
  • проверить BitConverter.IsLittleEndian значение, и если true:
    • либо поменять местами входные байты
    • или поменять вывод

Это тот же номер, но в обратном порядке.

BitConverter.ToString может возвращать строковое представление в обратном порядке: http://msdn.microsoft.com/en-us/library/3a733s97(v=vs.110).aspx

"Все элементы значения преобразуются. Порядок шестнадцатеричных строк, возвращаемых методом ToString, зависит от того, является ли компьютерная архитектура прямым или старшим".

Если вы внимательно посмотрите, байты в выходных данных от BitConverter поменялись местами.

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

Convert.ToString(hexValue, 16);
Другие вопросы по тегам