请问什么是大端小端以及如何判断大端小端
字节地址(序号) 低->高 | 0 | 1 | 2 | 3 |
大端 | 12 | 34 | 56 | 78 |
小端 | 78 | 56 | 34 | 12 |
typedef union { uint16_t v; uint8_t bytes[2]; // bytes[0] 是小地址,bytes[1]是大地址:w }u16; /* 方法1: 判断主机序是否为大端 * 利用联合体, 对2byte 联合体赋值后, 分别检查高低地址字节数据是否为大端特征 * */ void isBigEnding() { u16 a; a.v = 0x1234; if (a.bytes[0] == 0x12 && a.bytes[1] == 0x34) { printf("big ending\n"); } else if (a.bytes[0] == 0x34 && a.bytes[1] == 0x12) { printf("little ending\n"); } else { printf("error value"); } return; } #include <arpa/inet.h> /* 方法2: 判断是否为大端 * 利用已知的网络序为大端, 而htons是将2byte主机序数据转换成网络序, 判断转换前后是否有变化 * 如果没变化, 则说明为大端; 如果有, 则说明为小端 * */ void isBigEnding2() { uint16_t hport = 0x8000; uint16_t nport = htons(hport); // 网络字节序是大端 printf("number in net byte order is 0x%x\n", nport ); if (hport == nport) { printf("big ending\n"); } else { printf("little ending\n"); } } /* 写一个程序判断所使用系统的字节序 */ int main() { isBigEnding(); isBigEnding2(); return 0; }
unsigned int small = 0xAABBCCDD; unsigned char *big = &small; printf("small:%x big = %x ",small,*(++big));看下最后的结果是0xCC还是0xBB,如果是0xBB,则是大端序,如果是0xCC,则是小端序。