【发布时间】:2018-06-28 22:28:33
【问题描述】:
我正在尝试将结构转换为 char 向量。 我想发送我在 std::vector 中转换的结构,抛出一个 UDP 套接字并将其转换回另一侧。这是我的带有 PACK 属性的结构。
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
PACK(struct Inputs
{
uint8_t structureHeader;
int16_t x;
int16_t y;
Key inputs[8];
});
这里是测试代码:
auto const ptr = reinterpret_cast<char*>(&in);
std::vector<char> buffer(ptr, ptr + sizeof in);
//send and receive via udp
Inputs* my_struct = reinterpret_cast<Inputs*>(&buffer[0]);
问题是: 除我的 uint8_t 或 int8_t 外,一切正常。 我不知道为什么,但无论何时何地我在结构中放置一个 1Bytes 值, 当我将其回退时,该值不可读(但其他值是) 我尝试只输入 16 位值,即使使用 最大值,所以所有位都可以。
我认为这是内存中字节对齐的问题,但我不知道如何使它工作。
谢谢。
【问题讨论】:
-
第 1 步:删除所有宏和强制转换。第 2 步:使用序列化库,例如 ceral。第 3 步:利润。
-
你想做的事情是错误的,原因有很多。除非它们都使用完全相同的编译器(也是相同的版本)编译并在完全相同的平台和相同的架构中运行,否则没有任何东西可以保证对方将获得相同的结构。
-
有没有不使用外部库的序列化方法?这是一个项目,我对库有很多限制。
-
逐个成员、逐个字节地序列化成员。
-
当双方都理解并解决了实体序列化的局限性时,它没有任何问题。当然比任何“正确”的序列化都要快。不过,我不清楚这个问题。 '当我将 2 个字节放入 uint8_t' 是什么意思?
标签: c++ vector struct casting reinterpret-cast