2009-08-30 8 views
3

Если я хочу представить guid как набор целых чисел, как бы обработать преобразование? Я размышляю о том, как получить представление байтового массива guid и разбивать его на наименьшие возможные 32-битные целые числа, которые можно преобразовать обратно в исходный guid. Примеры кода предпочтительны ...Представить Guid как набор целых чисел

Кроме того, какова будет длина результирующего целочисленного массива?

ответ

4

Как-то мне было гораздо интереснее делать это так:

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

и преобразование обратно:

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 До сих пор мне больше всего понравилось. Никаких зависимостей нет. – grenade

+0

Тогда вы могли бы отметить это как ответ. : D – Botz3000

1

Руководство обычно представляет собой всего лишь 128-битное число.

- Редактирование

Таким образом, в C#, вы можете получить 16 байт через

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

это означает, что может быть представлено 4 целых чисел, например, байт [0-3] ... байт [12-15]? – grenade

+1

Да, действительно. –

+0

Как мы можем преобразовать массив байтов в 4 целых числа? – koumides

2

Будет ли строить в структуре Guid не хватает?

Конструктор:

public Guid(
    byte[] b 
) 

И

public byte[] ToByteArray() 

Который, возвращает массив байтов в 16-элемент, который содержит значение этого экземпляра.

Упаковка байтов в целые числа и наоборот должна быть тривиальной.

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

В GUID всего 16 байт, вы можете преобразовать его в четыре целых числа:

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

Преобразование обратно просто получить целые числа, как байтовые массивы и вместе взятые:

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

Почему downvote? Если вы не объясните, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

+0

это дает результат, но использует BitConverter, у которого есть проблема с Endianness. –

+0

@SuryaPratap: Тогда вам нужно выяснить, почему вы считаете, что это проблема. – Guffa

Смежные вопросы