gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:56 25 4
gpt4 key购买 nike

我正在以数据包(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com