<分区>
我需要序列化要通过网络发送的枚举值。发送部分用 C 语言编写,在 8 位微 Controller 上运行,没有可用的 Protocol Buffers 或类似库。接收部分使用 C++ (Linux)。我尝试了以下方法:
enum enum_x {
V1 = 1,
V2 = 2,
};
enum enum_y {
V3 = 1,
V4 = 2,
V5 = 3,
};
enum enum_z {
V6 = 1,
V7 = 2,
V8 = 3,
};
uint8_t serialize_enums(enum_x x, enum_y y, enum_z z) {
return x * 100 + y * 10 + z;
}
但是好像不成立。它在我的 Linux 机器上工作正常,但在 8 位系统上结果不正确(y 值似乎存储为 z 而 z 值丢失)。我尝试添加类型转换:
return (uint8_t)x * 100 + (uint8_t)y * 10 + (uint8_t)z;
但这并没有帮助。什么是正确的做法?
如果您想在 8 位
字段中发送它们,允许每个 enum
的值介于 0-3 之间,我会这样做:
#include <iostream>
#include <cstdint>
struct s_enum_t
{
s_enum_t(
int x,
int y,
int z)
: x_(x)
, y_(y)
, z_(z)
{}
union
{
struct
{
uint8_t x_ : 2;
uint8_t y_ : 2;
uint8_t z_ : 2;
uint8_t spare_ : 2;
};
uint8_t val;
};
};
int main()
{
s_enum_t v(1, 1, 1);
std::cout << v.val << "\n";
}
这将以非常具体的方式获取值。但是,在不同系统之间发送时,您必须了解每个系统的字节序方案。
澄清一下,每个单独的枚举值都以 2 位
的形式排列,可以更轻松地解决发送和接收系统之间的问题。在这种特殊情况下,您必须熟悉(由编译器)在每个系统上的布局方式,才能知道如何正确解码这些值。在可以打印出来的位域中具有单独的值(用于调试目的),使您可以在进行初始系统集成测试时轻松识别哪些字段是哪些。