当前位置: 技术问答>linux和unix
关于字节序的问题,
来源: 互联网 发布时间:2016-06-22
本文导语: #pragma pack(4) struct JB_PACKET_HEAD { int dwSize; int dwVersion; int dwMsgLen; int dwPacketNum; unsigned short wCheckSum; }; #pragma pack() 通常我们不...
#pragma pack(4)
struct JB_PACKET_HEAD
{
int dwSize;
int dwVersion;
int dwMsgLen;
int dwPacketNum;
unsigned short wCheckSum;
};
#pragma pack()
通常我们不同机子传输结构体的时候要解决字节序的问题,我也谢了一些代码
void CTcpSocket::HostToNetForPackHead(JB_PACKET_HEAD& PacketHead)
{
PacketHead.dwMsgLen = htonl(PacketHead.dwMsgLen);
PacketHead.dwPacketNum = htonl(PacketHead.dwPacketNum);
PacketHead.dwSize = htonl(PacketHead.dwSize);
PacketHead.dwVersion = htonl(PacketHead.dwVersion);
PacketHead.wCheckSum = htons(PacketHead.wCheckSum);
}
void CTcpSocket::NetToHostPackHead(JB_PACKET_HEAD& PacketHead)
{
PacketHead.dwMsgLen = ntohl(PacketHead.dwMsgLen);
PacketHead.dwPacketNum = ntohl(PacketHead.dwPacketNum);
PacketHead.dwSize = ntohl(PacketHead.dwSize);
PacketHead.dwVersion = ntohl(PacketHead.dwVersion);
PacketHead.wCheckSum = ntohs(PacketHead.wCheckSum);
}
问题是,我不想每个结构体,都写一次这样的代码,我要怎样能写一个通用的代码,适合任何结构体。(为了代码重用性高
struct JB_PACKET_HEAD
{
int dwSize;
int dwVersion;
int dwMsgLen;
int dwPacketNum;
unsigned short wCheckSum;
};
#pragma pack()
通常我们不同机子传输结构体的时候要解决字节序的问题,我也谢了一些代码
void CTcpSocket::HostToNetForPackHead(JB_PACKET_HEAD& PacketHead)
{
PacketHead.dwMsgLen = htonl(PacketHead.dwMsgLen);
PacketHead.dwPacketNum = htonl(PacketHead.dwPacketNum);
PacketHead.dwSize = htonl(PacketHead.dwSize);
PacketHead.dwVersion = htonl(PacketHead.dwVersion);
PacketHead.wCheckSum = htons(PacketHead.wCheckSum);
}
void CTcpSocket::NetToHostPackHead(JB_PACKET_HEAD& PacketHead)
{
PacketHead.dwMsgLen = ntohl(PacketHead.dwMsgLen);
PacketHead.dwPacketNum = ntohl(PacketHead.dwPacketNum);
PacketHead.dwSize = ntohl(PacketHead.dwSize);
PacketHead.dwVersion = ntohl(PacketHead.dwVersion);
PacketHead.wCheckSum = ntohs(PacketHead.wCheckSum);
}
问题是,我不想每个结构体,都写一次这样的代码,我要怎样能写一个通用的代码,适合任何结构体。(为了代码重用性高
|
我觉得在这个问题上,只有更通用的策略(比如3楼说的是一种),没有更通用的代码。
如果效率要求不是很高,可以考虑基于字符串的数据格式来构造协议,比如XML、json等。或者直接使用xml-rpc等已有进程间通信技术。
此外,既使直接基于socket并使用二进制数据,我个人也不太喜欢用struct + pack()的方式。原因主要有:
(1)一用到pack,常常引来可移植性方面的问题;而且如果不采用编译器默认的pack,本身就可能牺牲CPU性能,甚至造成异常。结果就是本想提高性能却实际降低了性能。
(2)基于struct的设计要么将业务对象都限制成了POD,从而失去灵活性;要么业务对象跟通信结构要做成独立的两套,而后者又是牺牲性能的;
我个人更倾向于构造类似于SocketWriter/SocketReader类,它们有类似于writeInt/readInt,writeShort/writeShort等方法,并最终构造出可以直接send/recv的char buffer。这样,只需要借助它们针对每种业务对象实现一个serialize函数即可。
如果效率要求不是很高,可以考虑基于字符串的数据格式来构造协议,比如XML、json等。或者直接使用xml-rpc等已有进程间通信技术。
此外,既使直接基于socket并使用二进制数据,我个人也不太喜欢用struct + pack()的方式。原因主要有:
(1)一用到pack,常常引来可移植性方面的问题;而且如果不采用编译器默认的pack,本身就可能牺牲CPU性能,甚至造成异常。结果就是本想提高性能却实际降低了性能。
(2)基于struct的设计要么将业务对象都限制成了POD,从而失去灵活性;要么业务对象跟通信结构要做成独立的两套,而后者又是牺牲性能的;
我个人更倾向于构造类似于SocketWriter/SocketReader类,它们有类似于writeInt/readInt,writeShort/writeShort等方法,并最终构造出可以直接send/recv的char buffer。这样,只需要借助它们针对每种业务对象实现一个serialize函数即可。