Заказать байтовый заказ в .NET.

Я создаю GUID, подобный этому

Guid g = new Guid(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF });
Console.WriteLine(g);

Выводит

03020100-0504-0706-0809-0a0b0c0d0e0f

В соответствии с Wikipedia в руководстве указано четыре части, и это объясняет, почему переключатель байтов байтов состоит из четырех групп. Однако в статье в Википедии также говорится, что все части хранятся в формате Big Endian. Очевидно, что первые три части не являются большими Endian. Метод GetBytes() метода guid возвращает байты в том же порядке, который используется для создания. Что объясняет это поведение?

Ответ 1

Похоже, что MS хранит пять частей в структуре. Первые 4 части имеют длину 2 или 4 байта и поэтому, вероятно, хранятся как собственный тип (т.е. WORD и DWORD) в формате с прямым порядком байтов. Последняя часть имеет длину 6 байт и поэтому обрабатывается по-разному (возможно, массив).

Указывает ли спецификация, что GUID хранится в порядке с прямым порядком байтов, или что хранение частей происходит в этом порядке, но отдельные части могут зависеть от реализации?

РЕДАКТИРОВАТЬ:

Из спецификации UUID, раздел 4.1.2. Расположение и порядок байтов (выделено мной):

Чтобы свести к минимуму путаницу в назначениях битов в октетах, UUID
определение записи определяется только в терминах полей, которые
целые числа октетов. Поля представлены с наибольшим
первый значительный.

...

При отсутствии явного заявления или протокола представления
В спецификации, напротив, UUID кодируется как 128-битный объект следующим образом:

Поля кодируются как 16 октетов, с размерами и порядком полей, определенных выше, и каждое поле кодируется сначала самым старшим байтом (известным как порядок сетевых байтов).

Возможно, MS хранит байты в правильном порядке, но не беспокоится о порядке передачи по сети для хоста частей WORD и DWORD для представления (что, по-видимому, соответствует спецификации, по крайней мере, из-за моего неквалифицированного чтения Это.)

Ответ 2

Я не эксперт здесь, но упоминаемая страница Wiki также говорит:

Однако ссылка на обычно используемую структуру данных [4] тип не упоминает порядок байтов

Эта цитата ([4]) указывает на http://msdn.microsoft.com/en-us/library/aa373931 (VS.85). aspx, который впоследствии идентифицирует, как Microsoft реализует GUID как

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

поскольку последние 8 байтов хранятся в виде байтового массива, я думаю, что это идентифицирует поведение, которое вы видите.