2012-04-17 9 views
13

sto creando un GUID come questoGuid Byte Order in .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); 

Emette

03020100-0504-0706-0809-0a0b0c0d0e0f 

Secondo Wikipedia ci sono quattro parti nel GUID e questo spiega il motivo per cui l'interruttore di ordine byte in quattro gruppi. Tuttavia l'articolo di Wikipedia afferma anche che tutte le parti sono memorizzate in formato Big Endian. Ovviamente le prime tre parti non sono Big Endian. Il metodo GetBytes() del guid restituisce i byte nello stesso ordine utilizzato per la creazione. Qual è la spiegazione di questo comportamento?

risposta

6

Sembra che MS stia memorizzando le cinque parti in una struttura. Le prime 4 parti sono lunghe 2 o 4 byte e sono quindi probabilmente memorizzate come un tipo nativo (cioè WORD e DWORD) in formato little endian. L'ultima parte è lunga 6 byte e quindi gestita in modo diverso (probabilmente una matrice).

La specifica indica che il GUID è memorizzato nell'ordine big-endian o che l'archiviazione di parti è nell'ordine ma le singole parti possono essere specifiche dell'implementazione?

EDIT:

Dalla UUID spec, paragrafo 4.1.2. Layout e Byte Order (sottolineatura mia):

per minimizzare la confusione sulle assegnazioni di bit all'interno ottetti, la definizione record di UUID
è definito solo in termini di campi che sono
numero integrale di ottetti. I campi vengono presentati con il numero più significativo di
.

...

In assenza di esplicita richiesta o protocollo presentazione
specificazione contraria
, un UUID è codificato come un oggetto 128 bit, come segue:

I campi sono codificati come 16 ottetti, con le dimensioni e l'ordine di i campi definiti sopra e con ciascun campo codificato con il maggior numero di byte significativi prima (noto come ordine di byte di rete).

Potrebbe essere che MS hanno sotred il byte è l'ordine corretto, ma non sono preoccupati di rete a host ordine le parti WORD e DWORD per la presentazione (che sembra essere ok secondo le specifiche, a almeno dalla mia lettura non qualificata.)

+0

Secondo Wikipedia (non ho verificato i riferimenti) lo standard UUID di cui si suppone che il GUID sia stato di implementazione, le parti dovrebbero essere codificate in Big Endian. Sia l'UUID che le specifiche GUID definiscono che ci sono quattro parti di dimensioni 4, 2, 2 e 8 byte in questo ordine. – Stilgar

+0

Infatti, e quando viene visualizzata l'ultima parte di 8 byte viene normalmente indicata come 2bytes-6bytes - entrambi sembrano essere big endian (come mostrato è il tuo esempio). – Grhm

+0

Sì, gli ultimi 8 byte sono visualizzati come 2-6 nella rappresentazione della stringa, probabilmente per motivi di leggibilità, ma fanno parte della stessa parte di dati. La vera domanda è se Guid sta violando lo standard o c'è qualche altra spiegazione. – Stilgar

5

Non sono un esperto qui, ma la pagina Wiki si parla, dice anche:

Tuttavia, il riferimento per un comune [4] struttura utilizzata dei dati tipo non menzionato in byte di ordinazione

Quella citazione ([4]) indica http://msdn.microsoft.com/en-us/library/aa373931(VS.85).aspx che identifica poi come Microsoft implementare un GUID come

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

poiché gli ultimi 8 byte sono memorizzati come array di byte, penso che questo identifichi il comportamento che stai vedendo.

+0

Quindi DWORD e WORD sono little endian per qualche motivo? – Stilgar

+1

http://en.wikipedia.org/wiki/Endianness Dipenderà dalla tua architettura. Su un'architettura x86, sì. – pms1969

+1

Ma questo significherebbe anche che GUID viola lo standard UUID? Inoltre, l'articolo di Wikipedia è un po 'fuorviante (affermando che un GUID memorizza parti di dati in formato Big Endian) – Stilgar