当前位置:  技术问答>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);

}
问题是,我不想每个结构体,都写一次这样的代码,我要怎样能写一个通用的代码,适合任何结构体。(为了代码重用性高

|
我觉得在这个问题上,只有更通用的策略(比如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函数即可。

    
 
 

您可能感兴趣的文章:

  • 【提问】关于字节 字的问题
  • 字节序的问题
  • 关于字节对齐问题????????????????
  • 关于字节最齐的默认值问题
  • linux中字节对齐问题
  • 关于suse linux 下的字节序对齐问题
  • gcc3.4中struct中字节对齐问题??找了很久没有确定的方法。
  • 急!!关于用getString方法取长字节字段的问题
  • 各位大虾帮帮忙,急!!!——有关字节对齐问题
  • 急!!关于用getString方法取长字节字段的问题,马上给分!!
  • 高分送高手,请教字节数组问题
  • linux下mencoder 转视频转出来的都是0字节```有没有人遇到这个问题```
  • 从Access数据库读大块数据问题,为什么5119字节左右是极限,怎么解决??
  • 关于RAW套接口收到的数据报的IPv4的头部的字节顺序问题?
  • 字节数组问题
  • 请教字节序问题,分析了一个例子,但是不得要领。
  • 结构体和网络字节序问题
  • 浅析C++字节对齐容易被忽略的两个问题
  • 问字节对齐的问题
  • Linux下的字节对齐问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我是想检查读出的字节和下一字节是不是相等,但从现在的输出来看,它输出的每一个字节都是显示 [B@77d134 ,如何进行字节的比较,用这种
  • InputStream读不了1000个字节后面的字节,怎么回事?
  • wchar_t 2字节?4字节?在线
  • socket程序中read字节个数与write字节个数不同
  • 【请教】read()返回的字节数远远小于write()返回的字节数,接收数据不完整。虚心求解
  • C++多字节字符与宽字节字符相互转换
  • 什么时候可以不用网络字节序
  • 字节码阅读器 JClassLib
  • Fedora 一个汉字占几个字节??
  • linux C 下char类型有几字节呀?
  • 控制shell脚本输出的字节数
  • 字节对齐
  • linux下如何计算8字节双精度浮点数double?
  • 大侠来解释下,系统,编译器,与变量字节的关系
  • 一个字符占几个字节?
  • 用g++开发,怎么设置结构(struct)1字节对齐?
  • 被TCP协议填充了1000个字节,为什么?
  • 8位 512字节的ecc校验
  • 二进制方式传送文件 影音文件字节数正确 但是播放不了
  • spansion最后4个字节擦除不掉


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3