Open nonocast opened 2 years ago
最近在分析FLV时都需要转换endianness,正好看到阮一峰的文章,趁此机会梳理一遍。
#include <stdint.h> #include <stdio.h> static void print_hex(const uint8_t *data, unsigned long len); int main(void) { uint32_t x = 1; printf("x address: 0x%lx(%lu) ", (unsigned long) &x, sizeof(x)); print_hex((const uint8_t *) &x, 4); printf("x value: %d\n", x); printf("address: 0x%lx: %02x\n", (unsigned long) &x, *((uint8_t *) &x)); printf("address: 0x%lx: %02x\n", (unsigned long) &x + 1, *((uint8_t *) &x + 1)); printf("address: 0x%lx: %02x\n", (unsigned long) &x + 2, *((uint8_t *) &x + 2)); printf("address: 0x%lx: %02x\n", (unsigned long) &x + 3, *((uint8_t *) &x + 3)); FILE *fp = fopen("dump", "wb"); fwrite(&x, sizeof(x), 1, fp); fclose(fp); return 0; } static void print_hex(const uint8_t *data, unsigned long len) { for (int i = 0; i < len; ++i) { printf("%02x ", data[i]); } printf("\n"); }
运行后输出:
~ make run -s x address: 0x16d9caf28(4) 01 00 00 00 x value: 1 address: 0x16d9caf28: 01 address: 0x16d9caf29: 00 address: 0x16d9caf2a: 00 address: 0x16d9caf2b: 00 ~ xxd dump 00000000: 0100 0000
两个选择:
事实:
为什么LE:
所以,LE的反序完全是为了计算效率和指针,如果突破这两个约束,则采用BE。
最近在分析FLV时都需要转换endianness,正好看到阮一峰的文章,趁此机会梳理一遍。
运行后输出:
分析
两个选择:
事实:
为什么LE:
所以,LE的反序完全是为了计算效率和指针,如果突破这两个约束,则采用BE。
参考阅读: