CSAPP---大小端字节序判断方法
之前在看《UNIX网络编程》这本书时有提到一种方法,利用union的性质,代码如下
#include<stdio.h>
int main()
{
union
{
short value;
char union_bytes[sizeof(short)];
}test;
test.value=0x0102;
//低位地址存放高位数据则为大端字节序
if((test.union_bytes[0]==1)&&(test.union_bytes[1]==2))
{
printf("big endian
");
}
//小端字节序
else if((test.union_bytes[0]==2)&&(test.union_bytes[1]==1))
{
printf("little endian
");
}
else
{
printf("unknown...
");
}
}
在看CSAP时发现了另外一种方法,首先在C语言中一个指针,无论它指向哪种数据类型,它的值都是某个存储块的第一个字节的虚拟地址,例如一个int占4个字节,则int指针的值就是第一个字节的地址,如果把int指针强制转换为char指针,然后解引用则得到第一个字节中存放的数据,代码如下
#include <stdio.h>
#include <unistd.h>
typedef unsigned char *byte_pointer;
void show_bytes (byte_pointer start, int len)
{
int i;
for (i = 0; i < len; i++)
printf (" %.2x", start[i]);
printf ("
");
}
void show_int (int x)
{
show_bytes ((byte_pointer) &x, sizeof(int));
}
//错误示例,int*指针解引用直接得到4个字节也就是整个int的数据
void show_int_bytes( int *start, int len)
{
int i;
for (i = 0; i < len; i++)
printf (" %.2x", start[i]);
printf ("
");
}
int main()
{
int a = 0x01020304;
show_int(a);
return 0;
}
如果输出结果为:04 03 02 01则为小端字节序
上一篇:
IDEA上Java项目控制台中文乱码
