概述
提到体系结构时,经常遇到大小尾端的概念,这里做个总结。
big endian:大尾端,也称大端(高位)优先存储。
little endian:小尾端,也称小端(低位)优先存储。
如下00000000 00000000 00000000 00000001的存储
大尾端: 00000000 00000000 00000000 00000001
addr+0 addr+1 addr+2 addr+3 //先存高有效位(在低地址)
小尾端: 00000001 00000000 00000000 00000000
addr+0 addr+1 addr+2 addr+3 //先存低有效位(在低地址)
故要判断机器的体系结构是大尾端还是小尾端,以下程序可以完成任务:
#include <</span>stdio.h>
int main()
{
int tt = 1;
char *c = (char*)(&tt);
if(*c == 1)
{
printf("litte endiann");
}
else
{
printf("big endiann");
}
return 0;
}
在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。
在Intel机器下,执行以下程序
int main()
{
printf("%d /n",htons(16));
return 0;
}
得到的结果是4096,初一看感觉很怪。
解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。
另外用注意,数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换。这是因为对于主机来说,大小尾端的最小单位为字节(byte)。
16 - 00000000 00001000
4096 - 00001000 00000000
最后
以上就是冷静月亮为你收集整理的大尾端 小尾端和 htons函数的全部内容,希望文章能够帮你解决大尾端 小尾端和 htons函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复