Порядок байтов в.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
Согласно Википедии, в руководстве есть четыре части, и это объясняет, почему порядок байтов переключается в четыре группы. Однако в статье Википедии также говорится, что все части хранятся в формате Big Endian. Очевидно, что первые три части не являются Big Endian. Метод GetBytes() в guid возвращает байты в том же порядке, который использовался для создания. Чем объясняется такое поведение?
2 ответа
Похоже, что MS хранит пять частей в структуре. Первые 4 части имеют длину 2 или 4 байта и поэтому, вероятно, хранятся как собственный тип (т. Е. WORD и DWORD) в формате с прямым порядком байтов. Последняя часть имеет длину 6 байт и поэтому обрабатывается по-разному (возможно, массив).
Указывает ли спецификация, что GUID хранится в порядке с прямым порядком байтов, или что хранение частей происходит в этом порядке, но отдельные части могут зависеть от реализации?
РЕДАКТИРОВАТЬ:
Из спецификации UUID, раздел 4.1.2. Расположение и порядок байтов (выделено мной):
Чтобы свести к минимуму путаницу о назначениях битов в октетах, UUID
определение записи определяется только в терминах полей, которые
целые числа октетов. Поля представлены с наибольшим
первый значительный....
При отсутствии явного заявления или протокола представления
В спецификации, напротив, UUID кодируется как 128-битный объект следующим образом:Поля кодируются как 16 октетов, с размерами и порядком полей, определенных выше, и каждое поле кодируется сначала самым старшим байтом (известным как порядок сетевых байтов).
Возможно, MS выбрала байты в правильном порядке, но не позаботилась о том, чтобы сеть-на-хост заказывала части WORD и DWORD для представления (что, по-видимому, нормально в соответствии со спецификацией, по крайней мере из-за моего неквалифицированного чтения Это.)
Я здесь не эксперт, но упомянутая вами вики-страница также говорит:
Тем не менее, ссылка на часто используемую [4] структуру типа данных не упоминает порядок следования байтов.
Эта цитата ([4]) указывает на http://msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx который впоследствии определяет, как Microsoft реализует GUID как
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
так как последние 8 байтов хранятся в виде байтового массива, я думаю, что это определяет поведение, которое вы видите.