c++ - UUID生成器问题

标签 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 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/

相关文章:

c++ - 如何获得 "static const unsigned char my_var[]"的长度

c++ - 使用 unique_ptr 的常量字符指针

c - 为什么我的程序不允许我进行第二次输入?

c - 这个程序是如何执行的呢?

linux - 当 cron 作业位于子目录中时如何删除目录

c++ - 我如何让一个类成员函数访问另一个类成员函数的私有(private)成员?

c++ - 以人类可读的形式在 QSettings 中保存自定义 QMap 模板实例化

c - libclang ,clang_Cursor_isAnonymous 什么是匿名声明?

linux - 导出在另一个文件中定义的变量

python - 在网络上的另一台计算机上启动进程