在 C++ 中将 struct 转换为uint8_t数组

convert struct to uint8_t array in C++

提问人:jkafernando 提问时间:11/10/2022 最后编辑:273Kjkafernando 更新时间:11/10/2022 访问量:639

问:

我有一个具有不同数据类型的 typedef 结构。number 数组具有负值和非负值。如何在 Linux 平台上将此结构转换为 C++ 中的 unint8t 数组。感谢这方面的一些帮助。谢谢。我尝试进行对话的原因是将此uint8_t缓冲区作为参数发送到函数。

typedef struct
{
  int enable;
  char name;
  int numbers[5];
  float counter;
};

感谢这样做的任何例子。谢谢

C++ Linux 结构 缓冲区 uint8t

评论

1赞 Some programmer dude 11/10/2022
顺便问一下,如果你用 C++ 编程,你为什么要使用你的结构?那不是必需的。typedef
0赞 Some programmer dude 11/10/2022
哦,还有一个只有一个字母的名字?它甚至无法保存 C 样式的以 null 结尾的字符串,除了空字符串(只有 null 终止符)。
0赞 Pepijn Kramer 11/10/2022
您想解决什么问题,通过网络发送数据,将对象保存/加载到磁盘?您正在进入二进制序列化的领域。不要认为任何事情都是理所当然的(这包括结构的内存布局)。而且也不要假设将该数组转换回有效对象总是安全的(POD 应该没问题)
2赞 Useless 11/10/2022
在这种情况下,简单地强制转换就可以了 - 但是您的结构布局将具有特定于平台的字节序和填充,通常不能保证与接收方的相同。
3赞 Eljay 11/10/2022
强化 Useless 的评论,当我们的平台从 DEC Alpha Tru64 UNIX 迁移到具有基于 Intel 的 Windows NT 机器的混合环境时,我的项目因未正确序列化/反序列化通过 TCP/IP 连接传出的对象而被“烧毁”。填充更改了,字节序更改了,甚至一些原始类型也更改了。真是一团糟。structsizeof

答:

0赞 Some programmer dude 11/10/2022 #1

对于像你展示的那种普通的旧数据结构,这是微不足道的:

您知道结构的大小(以字节为单位)(来自运算符)。sizeof

这意味着您可以创建该大小的字节向量。

一旦你有了这个向量,你就可以将结构对象的字节复制到向量中。

现在,您实质上拥有了结构对象的字节表示形式数组。


在代码中,它是这样的:

struct my_struct_type
{
    int enable;
    char name;
    int numbers[5];
    float counter;
};

my_struct_type my_struct_object = {
    // TODO: Some valid initialization here...
};

// Depending on the compiler you're using, and its C++ standard used
// you might need to use `std::uint8_t` instead of `std::byte`
std::vector<std::byte> bytes(sizeof my_struct_object);

std::memcpy(bytes.data(), reinterpret_cast<void*>(&my_struct_object), sizeof my_struct_object);

评论

0赞 jkafernando 11/10/2022
是的,我知道结构的大小。如何将字节从结构复制到向量中?
0赞 lorro 11/10/2022 #2

建议:使用 .对于该类型,C++ 允许您强制转换指向它的任何指针并使用 .(假设 .)char*reinterpret_cast<char*>(&obj)Obj obj;

如果你需要使用(而且它不是 typedef to ,你可以分配足够的内存并执行:uint8_t*char*memcpy

uint8_t buffer[sizeof(Obj)];
memcpy(buffer, &obj, sizeof(obj));

评论

0赞 jkafernando 11/16/2022
因此,一旦通过 tcp 套接字发送 bufffer,我该如何在服务器端构造结构。欣赏一个例子
0赞 lorro 11/16/2022
@jkafernando 同样,你只需交换 dest 和 src: data is in ,然后 .buffermemcpy(&obj, buffer, sizeof(obj));