Преобразование байтового массива в шестнадцатеричное значение с использованием класса 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);