网络传输中采用的大端标记法燃埋埋,也就是说先传比较高权值的数字, 就像 12一样,先传10,在传2,就算丢了后面一个,损失也不是太大。
小端就跟机器有关了。你在封装一个int之类的数字,封装进去之后就应该是大端的了,可以调用里面的 htons()皮蚂 或者htonl()函数来转化成大端的(当然你也可以自己按照大端的方液禅式封装,就会麻烦一点而已)。传输过程中当然也是大端的,接受到的buffer里面当然也是大端的,但是你在读取这个int类型的时候,就需要相应的将大端转化为小端了(采用ntohs() 函数或ntohl()函数来实现),这样你读取到的就是原来的数字。
可想而知,假如你用机器A和B通信,而且A和B的端序都是一样的话,中间自然就不用转换来转换去了。但是这不是好习惯,因为假如移植到另外端序的机器的话就需要修改代码笭害蒂轿郦计垫袭叮陋。所以最好还是用那几个函数。
简单来说,从内存地址增加的方向来说,大端就是先存放高序字节,小端就是先存放低序字节。例唯悉如:0x0102
-------->内存增加的方向------>
地址A------>地址A+1
大端:0102
小端:02 01
判断方法是利用union的一个特性,厅唯那就是里面的变量共享一段内存。
可以定义一个union.
union Test{
short num//2byte
char c[sizeof(num)]//2byte
}
然后存入一个0x0102或者其他数字到test.num中,因为共享内存的原因,可以访问c[1],c[2],查看里面的值来判断大小端。
一个实现是(参照unix网络编程中的一个例子):
[cpp] view plain copy print?
#include <stdio.h>
#include <conio.h>
union Test{
short num
char c[sizeof(short)]
}
int main()
{
union Test t//C++ 直接声明为Test t即可
t.num=0x0102
if(t.c[0]==1&&t.c[1]==2)
printf("大端!\n")
else if(t.c[0]==2&&t.c[1]==1)
printf("小端!\n")
else
printf("未知!\n")
getch()
return 0
}
在Win7 32bit里面用DEV c++运行的结果指伏乎为:
或者更简单的是存一个short值,然后取其地址。
[cpp] view plain copy print?
#include <stdio.h>
#include <conio.h>
int main()
{
short int num=0x0201
char *p=#
if(*p==0x02)
printf("大端!\n")
else if(*p==0x01)
printf("小端!\n")
else
printf("未知!\n")
getch()
return 0
}
测试结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)