2012-02-08 13 views
39

Cuando llama al ToByteArray() en un GUID en .NET, el orden de los bytes en la matriz resultante no es el esperado en comparación con la representación de cadena del GUID. Por ejemplo, para el siguiente GUID representa como una cadena:¿Por qué Guid.ToByteArray() ordena los bytes de la forma en que lo hace?

11223344-5566-7788-9900-aabbccddeeff 

El resultado de ToByteArray() es la siguiente:

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

Tenga en cuenta que el orden de los cuatro primeros bytes se invierte. También los bytes 4 y 5 se intercambian y los bytes 6 y 7 se intercambian. Pero los últimos 8 bytes están en el mismo orden en que se representan como en la cadena.

Entiendo que esto está ocurriendo. Lo que me gustaría saber es por qué .NET lo maneja de esta manera.

Como referencia, puede ver un poco de discusión y confusión acerca de esto (bases de datos incorrectas atribuidas a Oracle) here y here.

+1

Ver también http://stackoverflow.com/questions/8064648/net-native-guid-conversion y [este blog de Eric Lippert de ** 2004 **!] (Http://blogs.msdn.com/b /ericlippert/archive/2004/05/25/141525.aspx) – AakashM

+2

a) realmente no importa. b) es un gran pequeño problema endian. –

+18

a) Realmente importa cuando te muerde. Además, tener una mejor comprensión no solo de cómo funcionan las cosas, sino también de por qué funcionan de esa manera, lo hace más capaz de evitar ser mordido por comportamientos contraintuitivos como este. b) Fue bastante claro desde el principio que es un problema de endianidad. Pero es particularmente desconcertante porque los últimos 8 bytes se dejan en su orden original. Además, si va a representar un GUID como una cadena de hex, ¿no tendría más sentido representarlo en el orden de bytes real? –

Respuesta

24

Si usted lee la Examples section from the GUID constructor, encontrará su respuesta:

Guid(1,2,3,new byte[]{0,1,2,3,4,5,6,7}) crea un GUID que corresponde a "00000001-0002-0003-0001-020304050607".

a es un entero de 32 bits, b es un entero de 16 bits, c es un entero de 16 bits, y d es simplemente 8 bytes.

Dado que a, b y c son tipos de enteros en lugar de bytes sin procesar, están sujetos a pedidos endian al elegir cómo mostrarlos. El RFC for GUID's (RFC4122) establece que deben presentarse en formato big endian.

+3

La especificación de formato RFC 4122 se aplica a cómo se codifica un GUID "en el cable", y solo en ausencia de requisitos contextuales en sentido contrario. Dicho esto, la salida de 'ToByteArray' es incómoda porque los campos little-endian rompen la capacidad de ajuste binaria obvia en el campo. –

Cuestiones relacionadas