考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:
一种是将低序字节存储在起始地址,这称为小端字节序。
另一种方法是将高序字节存储在起初地址,这称为大端字节。
测试程序:
利用union类型 —— 可以利用union类型数据的特点:所有成员的起始地址一致
大端模式(Big-endian):数据的低字节存放在高地址中。
小端模式(Little-endian):数据的低字节存放在低地址中。
union型数据所占的空间等于其最大的成员所占的空间,对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,
即,联合体的访问不论对哪个变量的存取都是从union的首地址位置开始
-----------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char** argv)
{
union{
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;\\01是数据的高位字节 02是数据的低位字节
if(2 == sizeof(short))
{
if(un.c[0] == 1 && un.c[1] == 2)
{
printf("big-endian\n");
}
else if(un.c[0] == 2 && un.c[1] == 1)
{
printf("little-endian\n");
}
else
{
printf("unkonwn\n");
}
}
else
{
printf("sizeof(short) = %d\n", sizeof(short));
}
exit(0);
}
字节排序函数:
htons
htonl
ntohs
ntohl
h代表host
n代表network
s代表short
l代表long
只需要调用适当的函数在 主机字节序 和 网络字节序 之间转换某个给定的值,不需要去关心主机字节序和网络字节序的真实值。
原文:http://www.cnblogs.com/zhangxuan/p/4789696.html