考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:
一种是将低序字节存储在起始地址,这称为小端字节序。
另一种方法是将高序字节存储在起初地址,这称为大端字节。
测试程序:
利用union类型 —— 可以利用union类型数据的特点:所有成员的起始地址一致
- #include<stdio.h>
- #include<stdlib.h>
- static union
- {
- char a[4];
- unsigned long ul;
- }endian = {{'L', '?', '?', 'B'}};
- #define ENDIAN ((char)endian.ul)
- int main()
- {
- printf("%c/n", ENDIAN);
- system("pause");
- return 0;
- }
大端模式(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
只需要调用适当的函数在 主机字节序 和 网络字节序 之间转换某个给定的值,不需要去关心主机字节序和网络字节序的真实值。