2012-02-08 11 views
39

Po wywołaniu ToByteArray() na identyfikatorze GUID w .NET, kolejność bajtów w wynikowej tablicy nie jest tym, czego można oczekiwać w porównaniu do reprezentacji ciągów GUID. Na przykład, dla następujących GUID reprezentowane jako ciąg:Dlaczego Guid.ToByteArray() porządkuje bajty tak, jak to robi?

11223344-5566-7788-9900-aabbccddeeff 

Wynik ToByteArray() to:

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

Zauważ, że kolejność pierwszych czterech bajtów jest odwrócona. Również bajty 4 i 5 są zamieniane, a bajty 6 i 7 są zamieniane. Ale ostatnie 8 bajtów jest w tej samej kolejności, w jakiej są one reprezentowane w łańcuchu.

Rozumiem, że to się dzieje. Chciałbym wiedzieć, dlaczego .NET obsługuje to w ten sposób.

W celach informacyjnych można zobaczyć pewną dyskusję i zamieszanie na ten temat (nieprawidłowe przypisanie do baz danych Oracle) here i here.

+1

Zobacz także http://stackoverflow.com/questions/8064648/net-native-guid-conversion i [ten blog Eric Lippert z ** 2004 **!] (Http://blogs.msdn.com/b /ericlippert/archive/2004/05/25/141525.aspx) – AakashM

+2

a) to naprawdę nie ma znaczenia. b) to duży mały problem z endianami. –

+18

a) To naprawdę ma znaczenie, kiedy cię ugryzą. Ponadto lepsze zrozumienie nie tylko tego, jak działają, ale także dlaczego działają w ten sposób, pozwala lepiej unikać bycia ugryzionym przez takie sprzeczne z intuicją zachowania. b) Od samego początku było jasne, że chodzi o kwestię endianizmu. Ale jest to szczególnie kłopotliwe, ponieważ ostatnie 8 bajtów zostało w oryginalnej kolejności. Ponadto, jeśli zamierzasz reprezentować GUID jako ciąg szesnastkowy, czy nie ma sensu reprezentować go w kolejności bajtów? –

Odpowiedz

24

Jeśli czytasz Examples section from the GUID constructor znajdziesz odpowiedź:

Guid(1,2,3,new byte[]{0,1,2,3,4,5,6,7}) tworzy GUID, który odpowiada "00000001-0002-0003-0001-020304050607".

a jest 32-bitowy, b jest 16-bitowy, c jest 16-bitową liczbą całkowitą, a d jest tylko 8 bajtów.

Ponieważ a, b, a c są całkowitymi typy raczej niż surowe bajty, podlegają one endian zamawiania przy wyborze sposobu ich wyświetlania. RFC for GUID's (RFC4122) stwierdza, że ​​powinny być prezentowane w formacie big endian.

+3

Specyfikacja formatu RFC 4122 dotyczy sposobu kodowania identyfikatora GUID "na drucie" i tylko w przypadku braku przeciwnych wymagań kontekstowych. To powiedziawszy, wyjście 'ToByteArray' jest niewygodne, ponieważ małe-endianowe pola łamią niepomyślne binarnie sortowalności. –

Powiązane problemy