折叠 编辑本段 简介
折叠 编辑本段 跨平台
折叠 编辑本段 概念
关于这大小字节序的概念不是很想的明白 数据在
内存里是具体怎么存放的形式?为什么会有CPU解释的不同?数据不是按1湖2345678……这样的顺序一直排列的么?
如: 一个多字节值 0xFECDBA98,内存从地址100开始存放
降序: FE 对应地址100 | CD 对应地址 101 | BA 对应地址 102 | 98 对应地址 103
升序: 98 | BA | CD | FE ---->;same above
注意,我们的书写字数据表示法是从高字节位--->低字节位(从左到奔乌赠邀右)
内存地址生长方向为: 从左到右 由低到高(这是不变的)
数据为: 0x98BADCFE
降序(Little-endian)大端字节序存储时 由左到右
升序(Big-endian)小端字节序存储时 由右向左
折叠 编辑本段 验证
可以自己编一个小程序验证一下(用C的数组)
更简单的调用复师将VC里的checkEndian()
Intel处理器的字节顺序是和DEC VAX处理器的字节顺序一致的。因此与道概油格法苗映件它与68000型处理器船们且刚电其青汽以及Internet的牛顺序是不同的,所以用户在使用时要特别小心以保证正确的顺序。
任何从Windows Sockets函数对IP地址和端口号的引用和传送给些普执制Windows Sockets函数的IP地址和端口号均是按照网络顺序组织的,这也包括了sockaddr_in结构这一数据类型职福型技降新吧举选除中的IP地址域和端口域(但不包括sin_family域)。
折叠 案例1
如何手算主机字节顺道盛巩序转换为网络字节顺序?
假设某16位的整数,主机字节顺序的值是21,那么它的网络字节顺序是多少?
解决的步骤是:
1、将21化成二进制,二进制,如果不足16位就在其前面补0,补满16位。
21转换成二进制是:10101,在它前面补0,补满16位后就得到:
00000000#00010101
2、将这个16位二进制字符平分成两段,每段8位
0000000 000010101 == > 00000000#000断标需指举草教茶略10101
3、颠倒这轻社消两段的顺序,然后去温掉第一个字符"1"前面的0,化成十进制就得到了网络字节顺序的值了。
00受总000000#00010101颠倒后:00010101#00000000
即00 01 01 01 00 000000
去掉第一个"1"前面的0得到:10 10 么角销状跟客宪核10 00 00 00 0
布我村呼精生场结种突坚化成十进制得到:5376
通过这个程序可以市而代事静进行验证:
编译后,按提示输入ftp和tcp,就得到网络字节顺序值是在西品切还凯亚药刑罪极5376,主机字节顺序虹劝慨值是21。
16位的转换函数:ntohs和连屑喇htons
ntohs(network to host short)是将网络字节顺序转换为主机字节顺序,返回值是姜榜越级刻治叶只球渐燥一个16位的整数,即2个字节长度的整数(1字节=8位)short int,也可以写作uint16_t。
htons(host to network short)是将主机字节顺序转换跟范哥报过酸细为网络字节顺序,返回值也是一个16位的整数short int。
32位转露叫氧换函数ntohl和htonl。
ntohl(network t案o host long)是将网络字节顺序转换为主机字节顺序,返回值是一个16位的整数,即2个字节长度的整数(1字节=8位)long int,也可以写作uint32_t。
htonl(host to network long)是将主机字节顺序转换为网络字节顺序,返回值也是一个16位的整数long int。
IP地址使用的是32位的无符号整数,所以,在对IP地址进行处理的时候降刻原言训火布究,就需要用到32位的转换了。
一属由击连治印委犯正个点分十进制的IP费鲁五地址是192.16汽你单测剧急8.0.1,还原成原来的二进制原码是:
11000000 10101000 0000000 0000东课维七使可在呢孩0 0001
这是主机字符顺序存储的值。
将其按照每个字节分隔开来,即每8位分隔开来,得到:
11000000 任素了该吧资族鱼诗微核10101000 000须措叶远饭座械00000 0000000其山证袁尼绿量现常1
将这4段二进制编码进行完全颠倒,就得到了网络字节顺序:
00000001000000001010100011000000
是设继岩去掉第一个字符"1"前面无效的0,得到:
福婷挥备身吸雷罗浓假10 00 00 00 01 01 01 00 0统苦对时同受甚互快政首1 10 00 00 0
化成十进制得到:16820416
inet_addr练才函数可以将一个点分十进制的IP皇管群触汉地址转换成网络字节顺序的长整形十进制值。同样的,inet_ntoa函数将网络字节顺序的长整形十进制数值的IP地址转换成点针乱六类么采分十进制。
折叠 案例2
将一个点分向镇然既联识单率立宪胜十进制的IP地址转换成它的二进制原码
分析:用inet_addr函数,转换点地衣育止门跳李可确普分十进制的IP为网络字节顺序的长整型十进制数值后,再用ntohl函数将其转换成主机字节顺序的长整型整数,然后使用一个自定义函数将这个主机字节顺序的长整形整数转换成二进制。