2012-04-17 13 views
13

Estoy creando un GUID como estoGuid de orden de bytes en .NET

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); 

Esto da salida a

03020100-0504-0706-0809-0a0b0c0d0e0f 

Según Wikipedia Hay cuatro partes en el GUID y esto explica por qué el interruptor de fin de bytes en cuatro grupos Sin embargo, el artículo de Wikipedia también establece que todas las partes se almacenan en formato Big Endian. Obviamente, las tres primeras partes no son Big Endian. El método GetBytes() del guid devuelve los bytes en el mismo orden utilizado para la creación. ¿Cuál es la explicación para este comportamiento?

Respuesta

6

Parece que MS está almacenando las cinco partes en una estructura. Las primeras 4 partes tienen 2 o 4 bytes de longitud y, por lo tanto, probablemente se almacenen como un tipo nativo (es decir, WORD y DWORD) en formato little endian. La última parte tiene una longitud de 6 bytes y, por lo tanto, se maneja de forma diferente (probablemente una matriz).

¿Especifica la especificación que el GUID se almacena en orden big-endian, o que el almacenamiento de partes está en ese orden pero las partes individuales pueden ser específicas de la implementación?

EDIT:

Desde el UUID spec, sección 4.1.2. La disposición y orden de bytes (el énfasis es mío):

para minimizar la confusión acerca de las asignaciones de bits dentro de octetos, la definición de registro UUID
se define sólo en términos de campos que son
número entero de octetos. Los campos se presentan con el mayor
significativo primero.

...

En la ausencia de aplicación explícita o protocolo de presentación
especificación en contrario
, un UUID se codifica como un objeto 128 bits, como sigue:

Los campos se codifican como 16 octetos, con los tamaños y el orden de en los campos definidos anteriormente, y con cada campo codificado con el Byte significativo primero (conocido como orden de bytes de red).

Podría ser que MS han sotred los bytes es el orden correcto, pero no se han molestado a la red-a-host para las partes de palabras y DWORD para la presentación (que parece estar bien de acuerdo con la especificación, en al menos por mi lectura no especializada.)

+0

De acuerdo con Wikipedia (no revisé las referencias), el estándar UUID del cual se supone que GUID es la implementación indica que las partes deben estar codificadas en Big Endian. Las especificaciones UUID y GUID definen que hay cuatro partes de tamaños 4, 2, 2 y 8 bytes en este orden. – Stilgar

+0

De hecho, y cuando se muestra la última parte de 8 bytes se muestra normalmente como 2bytes-6bytes, y ambos parecen ser correctamente big endian (como se muestra en el ejemplo). – Grhm

+0

Sí, los últimos 8 bytes se muestran como 2-6 en la representación de cadena, probablemente por razones de legibilidad pero son parte de la misma parte de datos. La verdadera pregunta es si Guid está violando el estándar o si hay alguna otra explicación. – Stilgar

5

No soy un experto aquí, pero la página wiki que mencionas, también dice:

Sin embargo, la petición de frecuencia [4] estructura utilizada de los datos tipo no menciona byte de orden

Esa cita ([4]) apunta a http://msdn.microsoft.com/en-us/library/aa373931(VS.85).aspx que identifica posteriormente cómo Microsoft implementar un GUID como

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

ya que los últimos 8 bytes están almacenados como una matriz de bytes, creo que esto identifica el comportamiento que está viendo.

+0

¿Entonces DWORD y WORD son pequeños endian por alguna razón? – Stilgar

+1

http://en.wikipedia.org/wiki/Endianness Dependería de su arquitectura. En una arquitectura x86, sí. – pms1969

+1

¿Pero esto también significaría que el GUID viola el estándar UUID? También que el artículo de Wikipedia es un poco engañoso (afirmando que un GUID almacena partes de datos en formato Big Endian) – Stilgar

Cuestiones relacionadas