nonocast / me

记录和分享技术的博客
http://nonocast.cn
MIT License
20 stars 0 forks source link

学习 C/C++ (Part 25: 字节顺序 Endianness) #296

Open nonocast opened 2 years ago

nonocast commented 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。

参考阅读: