1.判断大端存储还是小端存储?
大端小端只在数据类型的长度超过一个字节时才有意义!
1.1 用共用体的方式
#include<stdio.h>
union un
{
char ch;
int a;
short b;
};
/*若int占4个字节,那char就在int的最低的那个字节,short就在int的低的
那两个字节字节。变量都是从低位开始往高位存储,变量的起始地址都是最低
位。只不过小端序是起始地址存低字节,而大端序是起始地址存高字节。*/
int main(int argc, char **argv)
{
union un myun;
printf("%d\n",sizeof(myun));
myun.a = 0x12345678;
if(myun.ch == 0x78) //别忘了0x,写成78就错了!
{
printf("little endian\n");
}
else
{
printf("big endian\n");
}
if(myun.b == 0x5678) //别忘了0x,别写成7856!
{
printf("little endian\n");
}
else
{
printf("big endian\n");
}
return 0;
}
1.2用指针的方式
#include<stdio.h>
int main(int argc, char **argv)
{
int a = 0x12345678;
char *p = (char*)&a;
if(*p == 0x78)
{
printf("little endian\n");
}
else
{
printf("big endian\n");
}
printf("p = %p *p = %#X\n",p,*p);
printf("p+1 = %p *(p+1) = %#X\n",p+1,*(p+1));
printf("p+2 = %p *(p+2) = %#X\n",p+2,*(p+2));
printf("p+3 = %p *(p+3) = %#X\n",p+3,*(p+3));
return 0;
}
解析:
/*若int占4个字节,那char就在int的最低的那个字节,short就在int的低的那两个字节字节。变量都是从低位开始往高位存储,变量的起始地址都是最低位。只不过小端序是起始地址存低字节,而大端序是起始地址存高字节。*/
2. 大小端转换函数原型
#define SYS_LITTLE_ENDIAN 1
#define TRUE 1
#if (SYS_LITTLE_ENDIAN == TRUE)
#define NTOHL(x) ((((x) & 0xFF000000)>>24 | ((x) & 0x00FF0000)>>8|\
(((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24))
#define NTOHS(x) ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
#define HTONL(x) NTOHL(x)
#define HTONS(x) NTOHS(x)
#else
#define NTOHL(x) (x)
#define NTOHS(x) (x)
#define HTONL(x) (x)
#define HTONS(x) (x)
#endif