我有一个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小端架构上运行。
e.g。样本输出
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
转换时出现了一些问题。
现在已经解决了。我不关心endianess。无论如何,字节都是随机的!
答案 0 :(得分:4)
似乎%X
说明符期望传递int
大小的输入,而您似乎正在传递unsigned char
(不是uuid[i]
是吗?)。
尝试这样做,看看是否有帮助:
for (int i = 0; i < 16; i++) {
int temp = uuid[i];
printf("%02X", temp);
}
printf("\n");
好的,看完马修的答案后我仔细看了看。
问题是memcpy
以及uuid
的(未知)类型。您将uint
复制到uuid
上。 uuid
的前4个字节是data[0]
的小端表示,应该是预期的。
现在有一个可以解释其余部分的理论是uint32
实际上是8个字节而不是4个,所以当你将data
的前16个字节复制到uuid
时我们会看到顺序:
data[0]
的4 LSB,小端data[0]
(垃圾)data[1]
的4 LSB,小端data[1]
的4 MSB(垃圾,由于某种原因全为零)data[2]
和data[3]
。那么sizeof(uint32)
等于什么?
答案 1 :(得分:1)
data
和uuid
的前4个字节相同,但顺序相反 - 看起来像字节序问题。
data
的第2个4字节和uuid
的第3个4字节也相同,但相反。类似的问题。
解决这两个问题,其余问题可能会落实到位。
答案 2 :(得分:0)
尝试使用此代码进行调试
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");
我刚刚在'X'之后添加了一个空格。
答案 3 :(得分:0)
这里发生了两件事:
通常,您无法假设编译器如何在内存中放置内容。 你必须采用老式的方式:uuid [0] = data [0]&gt;&gt; 24&amp; 0xFF的
答案 4 :(得分:0)
uint32在64位操作系统中不是32位,而是64位。我看到它here,但我认为在所有64位系统上都是如此。