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项目控制台中文乱码