gpt4 book ai didi

c++ - 对同一数据使用两个不同的结构

转载 作者:行者123 更新时间:2023-11-28 03:38:47 25 4
gpt4 key购买 nike

我需要将 UUID 从 C++ 代码传输到将在基于 Intel 8051 的加密狗上运行的 C 代码。我定义了以下结构以最便携的方式表示 UUID:

struct UUID {
unsigned char data1[4];
unsigned char data2[2];
unsigned char data3[2];
unsigned char data4[8];
};

嗯,这种字节数组结构在 C++ 中使用起来不是很方便,所以我定义了一个中间帮助类,如下所示:

#include <stdint.h> // #include <cstdint> in C++0x

class UUIDAssign {
public:
uint32_t data1;
uint16_t data2;
uint16_t data3;
uint64_t data4;

operator UUID() const
{
UUID uuid(*((UUID*)this));
return uuid;
}
};

这样我就可以写出类似的东西:

UUIDAssign assign1 = {0x80DFDD28, 0xF033, 0xB027, 0xCDD2078FC78A};
UUID uuid1 = assign1;

我没有看到另一种方法可以方便地用某些值初始化 UUID 结构。好吧,恕我直言,从字符串表示中初始化它是一个有问题的选项。

问题是:

  1. 我通过中间帮助类实现 UUID 初始化的方式不正确吗?你能给我一些建议吗?
  2. 填充呢?它会影响从 UUIDAssign 传输到 UUID 的数据吗?

最佳答案

union 是你的 friend :

#ifdef __CPLUSPLUS
#include <cstdint>
#include <cstdio>
#else
#include <stdint.h>
#include <stdio.h>
#endif

union UUID {
struct {
uint32_t data1;
uint16_t data2;
uint16_t data3;
uint64_t data4;
} cpp;
struct {
unsigned char data1[4];
unsigned char data2[2];
unsigned char data3[2];
unsigned char data4[8];
} c;
};

int main() {
UUID uuid = {0x80DFDD28, 0xF033, 0xB027, 0xCDD2078FC78A};

printf("%u\n%x%x%x%x\n", uuid.cpp.data1, uuid.c.data1[3], uuid.c.data1[2], uuid.c.data1[1], uuid.c.data1[0]);

return 0;
}

哪个输出(在小端,注意第二个值的反向打印):

2162154792
80dfdd28

必须访问“c”子结构的顺序是 machine-dependent .

关于c++ - 对同一数据使用两个不同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999727/

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