用于序列化枚举的正确且可移植的方式

时间:2012-10-18 14:42:50

标签: c++ c

我需要序列化要通过网络发送的枚举值。发送部分在C中并在8位微控制器上运行,没有协议缓冲器或类似的库可用。接收部分使用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;

但它没有帮助。什么是正确的方法?

1 个答案:

答案 0 :(得分:0)

如果您想在8-bit字段中发送它们,请为每个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";
}

这将以非常具体的方式得出价值。在不同系统之间发送时,您必须了解每个系统的endian方案。

为了澄清,2-bits中列出的每个枚举值都可以更容易地解决发送和接收系统之间的问题。在这种特殊情况下,您必须熟悉如何在每个系统(由编译器)上布局,以了解如何正确解码值。在可以打印出来的位域中具有单独的值(用于调试目的)允许您轻松识别在进行初始系统集成测试时哪些字段。