【发布时间】:2020-01-16 11:49:10
【问题描述】:
我们通过 UART 串行以高数据速率发送数据,因此数据大小很重要。对于我们的数据,最优化的格式是 Int24,可以简化为 C/C++ 下的 C 位域结构(GCC 编译器)以达到完美优化:
#pragma pack(push, 1)
struct Int24
{
int32_t value : 24;
};
#pragma pack(pop)
typedef std::array<Int24,32> ArrayOfInt24;
这些数据与其他数据打包在一起,并在设备和云基础设施之间共享。基本上我们需要有一个二进制序列化,它在不同架构和编程语言的设备之间发送。我们希望使用基于模式的二进制序列化,例如 ProtoBuffers 或 FlatBuffers,以避免客户端代码需要自己处理二进制补码符号位处理的相应位移和恢复。即在非 C 语言中读取 24 位值需要以下内容:
bool isSigned = (_b2 & (byte)0x80) != 0; // Sign extend negative quantities
int32_t value = _b0 | (_b1 << 8) | (_b2 << 16) | (isSigned ? 0xFF : 0x00) << 24;
如果尚不存在(如果有的话)现有的二进制序列化库可以很容易地修改以扩展对此的支持,因为我们愿意在这方面添加到任何开源项目中。
【问题讨论】:
-
感谢您的所有回复。我正在评估选项。
标签: c++ c int protocol-buffers flatbuffers