Представьте Guid как набор целых чисел

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

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


person grenade    schedule 30.08.2009    source источник


Ответы (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);
person Botz3000    schedule 30.08.2009

Поскольку 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);
person Guffa    schedule 30.08.2009
comment
Почему минус? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ. - person Guffa; 05.01.2012
comment
это достигает результата, но использует BitConverter, у которого есть проблема с Endianness - person Surya Pratap; 27.10.2014
comment
@SuryaPratap: Тогда вам нужно уточнить, почему вы считаете это проблемой. - person Guffa; 27.10.2014
comment
хорошо, если ввод поступает из-за границы машины, как вы узнаете порядок байтов - person Surya Pratap; 03.11.2014

Будет ли недостаточно встроенной структуры Guid?

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

public Guid(
    byte[] b
)

А также

public byte[] ToByteArray()

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

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

person Philip Fourie    schedule 30.08.2009

Guid обычно представляет собой просто 128-битное число.

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

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

byte[] b = Guid.NewGuid().ToByteArray();
person Noon Silk    schedule 30.08.2009
comment
означает ли это, что он может быть представлен 4 целыми числами, например, байт [0-3] ... байт [12-15]? - person grenade; 30.08.2009
comment
Как преобразовать обратно массив байтов в 4 целых числа? - person koumides; 18.08.2010