Подтвердить что ты не робот

С# BinaryWriter - и endianness

Я использую 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? почему?

4b9b3361

Ответ 1

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

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

LSB | MSB
00    04

Вы можете больше узнать о контенте.

Ответ 2

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

Ответ 3

Как побочный элемент, он записывает файл точно, как он указан в msdn:

Примечания

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

То, что вы просили, - это "формат большого конца". Вам нужно будет переопределить BinaryWriter, чтобы сделать это.

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

Примечание

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

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