2009-08-30 5 views
3

Si je veux représenter un guid comme un ensemble d'entiers, comment gérer la conversion? Je pense à l'obtention de la représentation en tableau d'octets du guid et à sa décomposition en le plus petit nombre possible d'entiers de 32 bits pouvant être reconvertis dans le guid original. Exemples de code préférés ...Représente un Guid comme un ensemble d'entiers

De même, quelle sera la longueur du tableau entier résultant?

Répondre

4

D'une certaine façon, je me suis beaucoup amusé à le faire de cette façon:

byte[] bytes = guid.ToByteArray(); 
int[] ints = new int[bytes.Length/sizeof(int)]; 
for (int i = 0; i < bytes.Length; i++) { 
    ints[i/sizeof(int)] = ints[i/sizeof(int)] | (bytes[i] << 8 * ((sizeof(int) - 1) - (i % sizeof(int)))); 
} 

et reconvertir:

byte[] bytesAgain = new byte[ints.Length * sizeof(int)]; 
for (int i = 0; i < bytes.Length; i++) { 
    bytesAgain[i] = (byte)((ints[i/sizeof(int)] & (byte.MaxValue << 8 * ((sizeof(int) - 1) - (i % sizeof(int))))) >> 8 * ((sizeof(int) - 1) - (i % sizeof(int)))); 
} 
Guid guid2 = new Guid(bytesAgain); 
+1

+1 Jusqu'à présent, j'aime le plus. Il n'y a pas de dépendances. – grenade

+0

Ensuite, vous pourriez le marquer comme réponse. :RÉ – Botz3000

1

A Guid est généralement juste un nombre de 128 bits.

- Edit

Donc, en C#, vous pouvez obtenir les 16 octets par

byte[] b = Guid.NewGuid().ToByteArray(); 
+0

ce que cela signifie qu'il peut être représenté par 4 entiers par exemple octet [0-3] ... octet [12-15]? – grenade

+1

Oui, en effet. –

+0

Comment convertir un tableau d'octets en 4 entiers? – koumides

2

Est-ce que la structure de construction en Guid ne suffit pas?

Constructeur:

public Guid(
    byte[] b 
) 

Et

public byte[] ToByteArray() 

qui, retourne un tableau d'octets 16 élément qui contient la valeur de cette instance.

Emballer les octets en entiers et vice versa devrait être trivial.

5
System.Guid guid = System.Guid.NewGuid(); 
    byte[] guidArray = guid.ToByteArray(); 

    // condition 
    System.Diagnostics.Debug.Assert(guidArray.Length % sizeof(int) == 0); 

    int[] intArray = new int[guidArray.Length/sizeof(int)]; 

    System.Buffer.BlockCopy(guidArray, 0, intArray, 0, guidArray.Length); 


    byte[] guidOutArray = new byte[guidArray.Length]; 

    System.Buffer.BlockCopy(intArray, 0, guidOutArray, 0, guidOutArray.Length); 

    System.Guid guidOut = new System.Guid(guidOutArray); 

    // check 
    System.Diagnostics.Debug.Assert(guidOut == guid); 
5

En tant que GUID est seulement 16 octets, vous pouvez le convertir en quatre entiers:

Guid id = Guid.NewGuid(); 

byte[] bytes = id.ToByteArray(); 
int[] ints = new int[4]; 
for (int i = 0; i < 4; i++) { 
    ints[i] = BitConverter.ToInt32(bytes, i * 4); 
} 

retransforme est simplement obtenir les entiers comme des tableaux d'octets et mis en place:

byte[] bytes = new byte[16]; 
for (int i = 0; i < 4; i++) { 
    Array.Copy(BitConverter.GetBytes(ints[i]), 0, bytes, i * 4, 4); 
} 
Guid id = new Guid(bytes); 
+0

Pourquoi la downvote? Si vous n'expliquez pas ce que vous pensez être faux, cela ne peut pas améliorer la réponse. – Guffa

+0

ceci obtient le résultat mais utilise BitConverter qui a le problème avec Endianness –

+0

@SuryaPratap: Alors vous devez clarifier pourquoi vous pensez que c'est un problème. – Guffa