Почему Guid.ToByteArray () упорядочивает байты так, как он это делает? - PullRequest
45 голосов
/ 08 февраля 2012

Когда вы вызываете ToByteArray() для GUID в .NET, порядок байтов в результирующем массиве отличается от ожидаемого по сравнению со строковым представлением GUID. Например, для следующего GUID, представленного в виде строки:

11223344-5566-7788-9900-aabbccddeeff

Результат ToByteArray() таков:

44, 33, 22, 11, 66, 55, 88, 77, 99, 00, AA, BB, CC, DD, EE, FF

Обратите внимание, что порядок первых четырех байтов обратный. Также байты 4 и 5 меняются местами, а байты 6 и 7 меняются местами. Но последние 8 байтов расположены в том же порядке, в котором они представлены, как в строке.

Я понимаю, что это происходит. Я хотел бы знать, почему .NET справляется с этим так.

Для справки, вы можете увидеть некоторые обсуждения и путаницу по этому поводу (неправильно приписывается базам данных Oracle) здесь и здесь .

1 Ответ

30 голосов
/ 08 февраля 2012

Если вы прочитаете раздел Примеры из конструктора GUID , вы найдете ответ:

Guid(1,2,3,new byte[]{0,1,2,3,4,5,6,7}) создает Guid, который соответствует "00000001-0002-0003-0001-020304050607".

a - это 32-разрядное целое число, b - это 16-разрядное целое число, c - это 16-разрядное целое число, а d - это просто 8 байтов.

Поскольку a, b и c являются целочисленными типами, а не необработанными байтами, при выборе способа их отображения они упорядочены по порядку байтов. В RFC для GUID (RFC4122) указано, что они должны быть представлены в формате с прямым порядком байтов.

...