https://www.cnblogs.com/hellogiser/p/big-endian-vs-little-endian.html https://www.bilibili.com/video/BV1pX4y1N7T4?p=14 https://blog.csdn.net/a1219532602/article/details/103442437

简介

字节序是指 : 多字节数据的存储顺序

比如 int 是4个字节,
内存分配了4个字节存储一个int型的数字 0x12345678
那么这4个字节中 第一个字节存的是 0x12 还是 0x78 ??
这是个问题

分类

  1. 小端格式: 将低位字节数据存储在低地址
  2. 大端格式: 将高位字节数据存储在低地址 (较符合人类的习惯, 先读取的是高位的数字)

不同的CPU使用的字节序是不同的

  • IBM, Motorola(Power PC), Sun的机器一般采用Big-endian方式存储数据
  • x86系列则采用Little-endian方式存储数据。

小端字节序的意义

小端字节序对于逻辑电路更有效率。逻辑电路先处理低位字节更有效率,因为计算都是从低位开始的,计算机中的内部处理逻辑都是使用小端字节序。
但是,大多数的网络协议和文件格式都是大端字节序,这样对用户更加友好。
既然有区分,在使用时肯定要使用一定的解析规则,下面进行简要介绍。
[

](https://blog.csdn.net/a1219532602/article/details/103442437)

判断字节序的C代码

  1. #include <stdio.h>
  2. //a, b 公用一块存储空间
  3. union un{
  4. int a; //占4字节
  5. char b;//占1字节
  6. };
  7. int main(int argc, char const *argv[])
  8. {
  9. union un myun;
  10. //a占4字节
  11. myun.a=0x12345678;
  12. printf("a = %#x\n", myun.a);
  13. printf("b = %#x\n", myun.b);
  14. if (myun.b == 0x78)
  15. {
  16. printf("小端存储\n");
  17. }else{
  18. printf("大端存储\n");
  19. }
  20. return 0;
  21. }
  22. /*
  23. big-endian: return 1
  24. little-endian: return 0
  25. */
  26. int checkEndianByInt()
  27. {
  28. int i = 0x12345678;
  29. char *c = (char *)&i;
  30. return(*c == 0x12);
  31. }
  32. /*
  33. big-endian: return 1
  34. little-endian: return 0
  35. */
  36. int checkEndianByUnion()
  37. {
  38. union
  39. {
  40. int a;// 4 bytes
  41. char b// 1 byte
  42. } u;
  43. u.a = 1;
  44. if (u.b == 1) return 0;
  45. else return 1;
  46. }

网络传输的字节序

https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E5%AD%97%E8%8A%82%E5%BA%8F/12610557

  • 网络协议指定了通讯协议使用 大端存储Big-endian

字节序转换函数

  1. htonl : host to network 32位
  2. htons : host to network 16位
  3. ntohl : network to host 32位
  4. ntohs : network to host 16位
  1. // #include <arpa/inet.h> //unix的实现
  2. #include <winsock2.h> //windows的实现
  3. #include <stdio.h>
  4. int main(int argc, char const *argv[])
  5. {
  6. unsigned int a = htonl(0x12345678);
  7. printf("a = %d\n", a);
  8. unsigned int b = ntohl(0x12345678);
  9. printf("b = %d\n", b);
  10. return 0;
  11. }

字节序 - 图1