c++ - 序列化枚举的正确且可移植的方法

标签 c++ c

<分区>

我需要序列化要通过网络发送的枚举值。发送部分用 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 位 的形式排列,可以更轻松地解决发送和接收系统之间的问题。在这种特殊情况下,您必须熟悉(由编译器)在每个系统上的布局方式,才能知道如何正确解码这些值。在可以打印出来的位域中具有单独的值(用于调试目的),使您可以在进行初始系统集成测试时轻松识别哪些字段是哪些。

关于c++ - 序列化枚举的正确且可移植的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957301/

相关文章:

c - gcc中的 '-Wextra'和 '-pedantic'有什么区别?

c - 在 C 中将 timeval 类型转换为字符串

c++ - 查找元组元素的最大值 C++

c++ - 方法的执行和结束

c++ - 使用自定义删除器 boost scoped_ptr/scoped_array

c++ - `std::packaged_task` 是否需要 CopyConstructible 构造函数参数?

c - 从 C 中的指针列表中设置指针内容

c# - PInvoke x64 崩溃与 .Net 4.0

c++ - 如何将对象的指针写入文件?

c - gtk 应用程序中的多任务