2015-12-14 16 views
10

Stavo pensando di GUID di recente, che mi ha portato a provare questo codice:Perché queste due stringhe non sono uguali?

Guid guid = Guid.NewGuid(); 
Console.WriteLine(guid.ToString()); //prints 6d1dc8c8-cd83-45b2-915f-c759134b93aa 
Console.WriteLine(BitConverter.ToString(guid.ToByteArray())); //prints C8-C8-1D-6D-83-CD-B2-45-91-5F-C7-59-13-4B-93-AA 
bool same=guid.ToString()==BitConverter.ToString(guid.ToByteArray()); //false 
Console.WriteLine(same); 

Si può vedere che ci tutti i byte sono, ma la metà di loro sono in ordine errato quando uso BitConverter.ToString. Perchè è questo?

+0

* indovinare cieco *: BitConverter & ByteArray non funziona bene insieme? –

+1

'guid.ToByteArray()' ** Restituisce un array di byte a 16 elementi che contiene il valore di questa istanza. ** –

+0

https://msdn.microsoft.com/en-us/library/system.guid.tobytearray (v = vs.110) .aspx –

risposta

11

Come da Microsoft documentation:

noti che l'ordine dei byte nella matrice di byte restituito è diversa dalla rappresentazione di stringa di un valore GUID. L'ordine del gruppo a quattro byte iniziale e dei successivi due gruppi a due byte viene invertito, mentre l'ordine dell'ultimo gruppo a due byte e del gruppo di sei byte di chiusura è lo stesso. L'esempio fornisce un'illustrazione.

using System; 

public class Example 
{ 
    public static void Main() 
    { 
     Guid guid = Guid.NewGuid(); 
     Console.WriteLine("Guid: {0}", guid); 
     Byte[] bytes = guid.ToByteArray(); 
     foreach (var byt in bytes) 
     Console.Write("{0:X2} ", byt); 

     Console.WriteLine(); 
     Guid guid2 = new Guid(bytes); 
     Console.WriteLine("Guid: {0} (Same as First Guid: {1})", guid2, guid2.Equals(guid)); 
    } 
} 
// The example displays the following output: 
// Guid: 35918bc9-196d-40ea-9779-889d79b753f0 
// C9 8B 91 35 6D 19 EA 40 97 79 88 9D 79 B7 53 F0 
// Guid: 35918bc9-196d-40ea-9779-889d79b753f0 (Same as First Guid: True)