如果我想将guid表示为一组整数,我将如何处理转换?我正在考虑获取guid的字节数组表示并将其分解为最少可能转换回原始guid的32位整数。代码示例首选...
此外,结果整数数组的长度是多少?
答案 0 :(得分: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);
答案 1 :(得分: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);
答案 2 :(得分: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);
答案 3 :(得分:2)
内置Guid结构是不够的?
构造
public Guid(
byte[] b
)
并且
public byte[] ToByteArray()
其中,返回包含此实例值的16元素字节数组。
将字节打包成整数,反之亦然应该是微不足道的。
答案 4 :(得分:1)
Guid通常只是一个128位的数字。
- 编辑
所以在C#中,你可以通过
获得16个字节byte[] b = Guid.NewGuid().ToByteArray();