关于字节顺序

wanwan0923 2010-08-21 11:15:04
我用c++ socket编程,udp包传送数据,在给数据打包和解包的时候有点搞不清楚字节的顺序了,比如我的协议是这样的 :版本号(四位)头长度(四位)包序号(16位)。。。,我是这样理解的:版本号应该是低四位,头长度是高四位,包序号的两个字节是低字节放在低位,还有就是每个比特流的高低应该是什么样的呢?
...全文
158 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2010-08-23
  • 打赏
  • 举报
回复
你太过纠缠socket了,想像socket是一种传输方法,那么通过内存传给另一个程序与使用socket传给另一个程序本质是没有差别的。
wanwan0923 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 austin_minny 的回复:]
最近也在干socket的活,我遇到的情况就是你传送方的字节顺序和接收到的是一样的,但也听有人说什么时候会有接受后会是反序的情况
[/Quote]
那你是怎么处理的?
wanwan0923 2010-08-23
  • 打赏
  • 举报
回复
struct _rcvdata
{
bitset<4>version;//版本号
bitset<4>HeadLen;//头长度
bitset<16>Udpid;//udp包序号
bitset<8>Checksum;//校验和
};
这是我定义的结构体,请问bitset<16>Udpid可以转换成整型吗?
ljhnew 2010-08-22
  • 打赏
  • 举报
回复
给你一个我写的说明文档吧。
http://blog.csdn.net/ljhnew/archive/2010/08/22/5829821.aspx
Eleven 2010-08-22
  • 打赏
  • 举报
回复
发送端直接发送结构体数据,不过要注意一下,结构体成员中不要有指针成员,接收端将接受到的数据强制转换即可。。。
wanwan0923 2010-08-22
  • 打赏
  • 举报
回复
哦 好的 多谢了
austin_minny 2010-08-22
  • 打赏
  • 举报
回复
最近也在干socket的活,我遇到的情况就是你传送方的字节顺序和接收到的是一样的,但也听有人说什么时候会有接受后会是反序的情况
dickbarry 2010-08-21
  • 打赏
  • 举报
回复
1、机器字节序应该是大端方式,网络字节序应该是小端方式。但由于都是用机器接发数据包,所以不用考虑字节序问题。
2。版本号只有四位,得到其值的方法很多。比如你可以用bitset之类等等。你可以多看一下raw socket编程,相信你能得到不少启发
wanwan0923 2010-08-21
  • 打赏
  • 举报
回复
就是说我这样不能实现了?如果我定义了个结构体,那比如版本号只有四位应该如何定义呢?
dvlinker 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jennyvenus 的回复:]

你不用关注bit流吧,同一cpu系列机器上可以直接使用socket传结构体。
[/Quote]都是这样处理的
用户 昵称 2010-08-21
  • 打赏
  • 举报
回复
不用
wanwan0923 2010-08-21
  • 打赏
  • 举报
回复
我的解包程序大致是这样的:
int HeadLen;//头长度
UINT udpid;//udp包序号
UINT ServiceID;//业务标识
UINT MsgID;//消息序号
int beginflg;//开始标志
int endflg;//结束标志

int bytTemp;


version=(*pdest)&0x0f;
HeadLen=(*pdest)&0xf0;

udpid=(*pdest)+(*(pdest+1))*256;
pdest=pdest+2;
ServiceID=(*pdest)+(*(pdest+1))*256;
pdest=pdest+2;
Posid=(*pdest)&0x03;
MsgID=(*pdest)&0xf0+(*(pdest+1))*256;
beginflg=arrdata[HeadLen]&0x01;
endflg=(arrdata[HeadLen]&0x02)>>1;
datalen=(arrdata[HeadLen])&0xf0+arrdata[HeadLen+1]*256;
transmitid=(arrdata[HeadLen+2])&0x7f;
if(ServiceID==65534)
{
if((MsgStyle==1)&&(DataStyle==160))
{
。。。
。。。
。。。
}
}
难道不需要知道比特流的高低吗?
wanwan0923 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyilong19 的回复:]
字节顺序,有大头,小头,之分,不过你既然是用socket传输,像楼上说的那样,不需要关注这些底层了,
用结构体定义好了,在接受的时候,用结构体指针读取对应的缓冲,就可以了,不会出错
[/Quote]
我接收的时候没有用结构体,就直接根据协议位接收的,那样也不用关心吗?我要接收一个文件,用结构体可以吗?思路是什么呢?
副组长 2010-08-21
  • 打赏
  • 举报
回复
通常我们用的都是LittleEndian,传输时使用的是BigEndian。如果用字节流传送双字节以上的数据要自己颠倒下次序。别的一般不用。
xiaoyilong19 2010-08-21
  • 打赏
  • 举报
回复
字节顺序,有大头,小头,之分,不过你既然是用socket传输,像楼上说的那样,不需要关注这些底层了,
用结构体定义好了,在接受的时候,用结构体指针读取对应的缓冲,就可以了,不会出错
用户 昵称 2010-08-21
  • 打赏
  • 举报
回复
你不用关注bit流吧,同一cpu系列机器上可以直接使用socket传结构体。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧