C# BinaryWriter — и порядок следования байтов

Я использую BinaryWriter в своем коде, вот мой код:

static void Main(string[] args)
{
    FileInfo file = new FileInfo(@"F:\testfile");
    if (file.Exists) file.Delete();
    using (BinaryWriter bw = new BinaryWriter(file.Create()))
    {
        ushort a = 1024;
        ushort b = 2048;
        bw.Write(a);
        bw.Write(b);
        bw.Write(a);
        bw.Write(b);
    }
    Console.ReadLine();
}

Но шестнадцатеричный выходной файл:

введите описание изображения здесь

введите описание изображения здесь

Разве это не 0x0004 = 4? Зачем?


person Eddy Lin    schedule 10.03.2016    source источник


Ответы (3)


Хотя 1024 это 0x0400. Когда дело доходит до хранения этого в файле или памяти, возникает вопрос, должны ли мы использовать нотацию с прямым порядком байтов или с прямым порядком байтов?

В случае BinaryWriter это прямой порядок байтов. Это означает, что сначала идет LSB, затем идет MSB. Следовательно, он хранится как:

LSB | MSB
00    04

Вы можете прочитать больше о порядке следования байтов.

person Giorgi Moniava    schedule 10.03.2016
comment
Я знаю, что это немного поздно, но что касается BinaryWriter и любого другого класса записи, используйте конструктор, который также принимает кодировку. Затем используйте Encoding.BigEndianUnicode для записи с прямым порядком байтов. - person kam; 17.05.2021

Кстати, он пишет в файл точно так, как указано в MSDN:

Примечания

BinaryWriter хранит этот тип данных в формате с прямым порядком байтов.

То, что вы просили, это формат с обратным порядком байтов. Вам придется переопределить BinaryWriter, чтобы сделать это.

Обратите внимание, что BinaryWriter ведет себя иначе, чем BitConverter. BinaryWriter всегда с прямым порядком байтов, а BitConverter.GetBytes(ushort) (это совершенно другая функция, но она имеет общее соединение: преобразование чисел в байты) имеет локальный порядок байтов (поэтому он использует порядок байтов компьютера)

Примечание

Порядок байтов в массиве, возвращаемом методом GetBytes, зависит от того, является ли архитектура компьютера прямым или обратным порядком байтов.

В конце концов, на ПК Intel/AMD эта разница неактуальна: Intel использует Little Endian, как и почти все сотовые телефоны. Единственное известное мне большое исключение, которое поддерживает .NET (в специальной версии), — это Xbox360.

person xanatos    schedule 10.03.2016

Если я не ошибаюсь, на дисплее порядковый номер вывода изменен на противоположный по отношению к вашим ожиданиям. Хотя шестнадцатеричное представление 1024 равно 0400, оно может быть сохранено как 0004, в зависимости от порядка следования байтов кодировки или платформы.

person Codor    schedule 10.03.2016