0
字节序
291
8页
11次
墨值0
- 1 -
大端字节(big-endian)
小端字节(little-endian)
十六进制表达都是高位在左,低位在右,逻辑顺序,如:0x3132(0x32 是低位,0x31 是高位)
因为现行的计算机都是以八位一个字节为存储单位,那么一个 16 位的整数,也就是 C 语言中的
short,在内存中可能有两种存储顺序 big-endian litte-endian.
考虑一个 short 整数 0x3132(0x32 是低位,0x31 是高位),把它赋值给一个 short 变量,那么它在内
存中的存储可能有如下两种情况:
大端字节(Big-endian):
----------------->>>>>>>>内存地址增大方向
short 变量地址
0x1000 0x1001
_________________________________
| |
| 0x31 | 0x32
|________________| ________________
高位字节在低位字节的前面,也就是高位在内存地址低的一端.可以这样记住(大端->高位->在前->
正常的逻辑顺序)
小端字节(little-endian):
----------------->>>>>>>>内存地址增大方向
short 变量地址
0x1000 0x1001
_________________________________
| |
| 0x32 | 0x31
|________________ | ______________
低位字节在高位字节的前面,也就是低位在内存地址低的一端.可以这样记住(小端->低位->在前->
与正常逻辑顺序相反)
可以做个实验
windows 上下如下程序
#include
#include
void main( void )
{
short test;
- 2 -
FILE* fp;
test = 0x3132; //(31ASIIC 码的’1,32ASIIC 码的2)
if ((fp = fopen ("c:\\test.txt", "wb")) == NULL)
assert(0);
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
}
然后在 C 盘下打开 test.txt 文件,可以看见内容是 21, test 等于 0x3132,可以明显的看出来 x86
的字节顺序是低位在前.如果我们把这段同样的代码放到(big-endian)的机器上执行,那么打出来的
文件就是 12.这在本机中使用是没有问题的.但当你把这个文件从一个 big- endian 机器复制到一个
little-endian 机器上时就出现问题了.
如上述例子,我们在 big-endian 的机器上创建了这个 test 文件,把其复制到 little-endian 的机器
上再用 fread 读到一个 short 里面,我们得到的就不再是 0x3132 而是 0x3231 ,这样读到的数据就
是错误的,所以在两个字节顺序不一样的机器上传输数据时需要特别小心字节顺序,理解了字节顺
序在可以帮助我们写出移植行更高的代码.
正因为有字节顺序的差别,所以在网络传输的时候定义了所有字节顺序相关的数据都使用
big-endian,BSD 的代码中定义了四个宏来处理:
#define ntohs(n) //网络字节顺序到主机字节顺序 n 代表 net, h 代表 host, s 代表 short
#define htons(n) //主机字节顺序到网络字节顺序 n 代表 net, h 代表 host, s 代表 short
#define ntohl(n) //网络字节顺序到主机字节顺序 n 代表 net, h 代表 host, s 代表 long
#define htonl(n) //主机字节顺序到网络字节顺序 n 代表 net, h 代表 host, s 代表 long
举例说明下这其中一个宏的实现:
#define sw16(x) \
((short)( \
(((short)(x) & (short)0x00ffU) << 8) | \
(((short)(x) & (short)0xff00U) >> 8) ))
这里实现的是一个交换两个字节顺序.其他几个宏类似.
我们改写一下上面的程序
#include
#include
of 8
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜
近期活动
全部
暂无活动,敬请期待...
相关课程
全部