gpt4 book ai didi

c++ - UUID生成器问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:38 29 4
gpt4 key购买 nike

我有一个 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com