我有一个 uuid 类,它是可移植库的一部分,它使用以下代码段进行初始化。它在windows下工作正常,但在linux下它是 没有正确生成 UUID。
uint32 data[4];
data[0] = rng.Get();
data[1] = rng.Get();
data[2] = rng.Get();
data[3] = rng.Get();
data[1] = (data[1] & 0xffffff0f) | 0x40;
data[2] = (data[2] & 0x7fffffff) | 0x40000000;
printf("12345678901234567890123456789012\n");
memcpy(uuid, data, 16);
for (int i = 0; i < 4; i++)
printf("%04X", data[i]);
printf("\n");
for (int i = 0; i < 16; i++)
printf("%02X", uuid[i]);
printf("\n");
printf 语句是我调试的。
但是,数字搞砸了。 为什么底部 4 个字节为空? 为什么打印的第一个 uuid 与最后一个不同?
平台是 x86 上的 64bt linux。这将始终在 x86 small endian 架构上运行。
例如示例输出
1st run
12345678901234567890123456789012
B6D2ADAF46CF624A581187F3670BBEE0
AFADD2B6D6E792FB4A62CF4600000000 // why is this different from the previous no?. also the last 4 bytes not set???
2nd run
12345678901234567890123456789012
96D6D234D5602743548FD812A0D96818
34D2D6965B65F32F432760D500000000 // same problem as earlier
转换出现问题。
这个问题现在已经解决了。我不关心字节顺序。字节无论如何都是随机的!
最佳答案
似乎 %X
说明符期望传递一个 int
大小的输入,而您似乎传递给它一个 unsigned char
(这不是 uuid[i]
是什么吗?)。
尝试这样做,看看是否有帮助:
for (int i = 0; i < 16; i++) {
int temp = uuid[i];
printf("%02X", temp);
}
printf("\n");
更新-新理论
OK,看了Matthew的回答我仔细看了下
问题是 memcpy
以及(未知)类型的 uuid
。您将 uint
复制到 uuid
上。 uuid
的前 4 个字节是 data[0]
的小端表示,正如预期的那样。
现在可以解释其余部分的理论是 uint32
实际上是 8 个字节而不是 4 个字节,所以当您将 data
的前 16 个字节复制到 uuid
我们看到的顺序是:
data[0]
的 4 LSB,小端data[0]
的 4 个 MSB(垃圾)data[1]
的 4 LSB,小端data[1]
的 4 MSB(垃圾,出于某种原因全为零)data[2]
和data[3]
什么都没有。
那么 sizeof(uint32)
等于什么?
关于c++ - UUID生成器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5427037/