c++ - 如何解释 C++ 中的二进制数据?

标签 c++ embedded byte

我正在以数据包(64 字节)的形式向设备发送二进制数据或从设备接收二进制数据。数据有特定的格式,部分格式随不同的请求/响应而变化。

现在我正在为接收到的数据设计一个解释器。简单地按位置读取数据是可以的,但是当我有十几种不同的响应格式时看起来就不那么酷了。我目前正在考虑为此目的创建一些结构,但我不知道如何使用填充。

也许有更好的方法?


相关:

最佳答案

您需要使用结构和/或 union 。您需要确保您的数据在连接的两端都正确打包,并且如果连接的任何一方有可能以不同的方式运行,您可能希望在每一端转换网络字节顺序和从网络字节顺序转换字节顺序。

举个例子:

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */
typedef struct {
    unsigned int    packetID;  // identifies packet in one direction
    unsigned int    data_length;
    char            receipt_flag;  // indicates to ack packet or keep sending packet till acked
    char            data[]; // this is typically ascii string data w/ \n terminated fields but could also be binary
} tPacketBuffer ;
#pragma pack(pop)   /* restore original alignment from stack */

然后在分配时:

packetBuffer.packetID = htonl(123456);

然后在接收时:

packetBuffer.packetID = ntohl(packetBuffer.packetID);

下面是EndiannessAlignment and Structure Packing的一些讨论

如果您不打包结构,它最终会与单词边界对齐,并且结构的内部布局和大小将不正确。

关于c++ - 如何解释 C++ 中的二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852334/

相关文章:

c++ - 如何清除字符串流?

c++ - 在自由函数中定义的类型,可通过外部自动访问。语言错误还是功能?

arrays - Swift - 将 UInt8 字节转换为位数组

c - 在 CodeVisionAVR 中使用定时器生成正弦波形

c - 用指针存储的数据

c - 缓冲区溢出 strcpy()

C++将取消引用指针对象分配给变量并使用它

c++ - 将输入文件中的整数相加

c - 是否可以使用STM32生成CAN总线错误?

我可以在 C 语言的闪存中连接两个 #define 字符串吗?