gpt4 book ai didi

c - Little Endian系统中Big Endian系统发送的结构数据的反序列化

转载 作者:太空宇宙 更新时间:2023-11-04 05:46:04 27 4
gpt4 key购买 nike

我有一个 C 程序,它通过套接字在 UDP 数据包中从大型机接收数据。 C 程序的主机正在从 Unix(大端)更改为 Linux(小端),程序不再运行。我目前没有更改大型机客户端程序的选项。

程序执行recvfrom 并将数据接收到char 数组中。以前我们能够简单地将此缓冲区转换为与从 MF 传递的内容相匹配的结构,并且一切正常。现在,由于不同的字节对齐方式,到结构的映射失败了。这是结构和一些代码。

struct CCClntPkt
{
unsigned short packet_type;
unsigned short reply_socket;
unsigned long msg_ID;
unsigned short msg_length;
unsigned char client_string[250];
};

之前用于将接收到的数据缓冲区转换为该结构的代码如下所示:

char BCpacket_in[MAX_PACKET];
struct CCClntPkt *pClntPkt;

<snip>

rcv_cnt = recvfrom(BCServerSocket, BCpacket_in,
sizeof(BCpacket_in),0x0,(struct sockaddr *)&from,
&fromlen);

if (rcv_cnt > 0)
{
pClntPkt = (struct CCClntPkt *) &BCpacket_in;
}

我能够通过使用 ntohs 获得 packet_type 和 reply_socket 的正确值,但字符字段 client_string 被破坏了。我还尝试在结构之前放置一个 pragma pack(1),在结构之后放置一个 pragma pack(0),但似乎仍然存在对齐问题。

我还尝试了 BCpacket_in 的位移值,并且能够获得 packet_type 和 reply_socket 的正确值,但无法弄清楚如何提取 ulong msg_ID。代码是:

packet_type = BCpacket_in[0] << 8;
packet_type |= BCpacket_in[1];

reply_to_socket = BCpacket_in[2] << 8;
reply_to_socket |= BCpacket_in[3];

/*
msg_ID = BCpacket_in[4] << 24;
msg_ID |= BCpacket_in[5] << 16;
msg_ID |= BCpacket_in[6] << 8;
msg_ID |= BCpacket_in[7];
*/

在这一点上我很困惑,所以感谢任何帮助。我不是这个程序的原作者,我的 C 知识非常有限。不过,我不介意做这项工作,所以如果能提供任何相关引用资料,我将不胜感激。谢谢!

最佳答案

您必须手动将接收到的数据包 (BCpacket_in) 解析为 struct CCClntPkt 数据包,这是唯一可移植的方法。 ntohl (network-to-host long) 函数族正确处理字节顺序转换;请参阅联机帮助页 byteorder(3)endian(3)

这些函数假定所有数据包都作为大端字节序通过网络发送,因为这是互联网标准。

关于c - Little Endian系统中Big Endian系统发送的结构数据的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958624/

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