UUID发电机问题

时间:2011-03-24 23:53:48

标签: c++ c linux uuid

我有一个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。无论如何,字节都是随机的!

5 个答案:

答案 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,小端
  • 4 {MS} data[0](垃圾)
  • data[1]的4 LSB,小端
  • data[1]的4 MSB(垃圾,由于某种原因全为零)
  • data[2]data[3]

那么sizeof(uint32)等于什么?

答案 1 :(得分:1)

datauuid的前4个字节相同,但顺序相反 - 看起来像字节序问题。

  • 这是因为printf将每个uint32打印为一个块,但是(unsigned?)字符按内存顺序打印。

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)

这里发生了两件事:

  1. 结束问题
  2. 您使用的是64位计算机,因此编译器会将(32位)整数与本机字对齐
  3. 通常,您无法假设编译器如何在内存中放置内容。 你必须采用老式的方式:uuid [0] = data [0]&gt;&gt; 24&amp; 0xFF的

答案 4 :(得分:0)

uint32在64位操作系统中不是32位,而是64位。我看到它here,但我认为在所有64位系统上都是如此。