[PIC®/AVR®/dsPIC®产品] 大小端问题的测试方法

[复制链接]
948|5
 楼主| 598330983 发表于 2024-9-28 12:18 | 显示全部楼层 |阅读模式
测试系统的大小端问题(Little Endian 或 Big Endian)可以通过以下几种方法来进行验证:
方法 1:使用联合体(Union)进行测试
可以使用 union 来检测系统的字节序。通过将一个多字节变量(如 int 或 short)与一个字节数组联合在一起,来检查该变量在内存中的存储顺序。

示例代码(C/C++):

  1. #include <stdio.h>

  2. union {
  3.     int num;
  4.     char bytes[4];
  5. } endianTest;

  6. int main() {
  7.     endianTest.num = 0x12345678;

  8.     // 根据不同的系统字节序,字节的存储顺序会不同
  9.     if (endianTest.bytes[0] == 0x78) {
  10.         printf("Little Endian\n");
  11.     } else if (endianTest.bytes[0] == 0x12) {
  12.         printf("Big Endian\n");
  13.     } else {
  14.         printf("Unknown Endian\n");
  15.     }

  16.     return 0;
  17. }
解释:
  • 在这个代码中,我们将一个 int 类型的数字 0x12345678 存入联合体 endianTest 中,然后通过访问字节数组 bytes[] 来检查其字节顺序。
  • 如果系统是 小端序(Little Endian),则最低有效字节 0x78 存储在内存的低地址,因此 bytes[0] 的值是 0x78。
  • 如果系统是 大端序(Big Endian),则最高有效字节 0x12 存储在内存的低地址,因此 bytes[0] 的值是 0x12。

 楼主| 598330983 发表于 2024-9-28 12:19 | 显示全部楼层
方法 2:通过指针操作测试
可以通过将一个多字节变量的地址转换为 char* 指针,然后逐个字节进行检查。

示例代码(C/C++):
  1. #include <stdio.h>

  2. int main() {
  3.     int num = 0x12345678;
  4.     char *bytePointer = (char *)&num;

  5.     if (bytePointer[0] == 0x78) {
  6.         printf("Little Endian\n");
  7.     } else if (bytePointer[0] == 0x12) {
  8.         printf("Big Endian\n");
  9.     } else {
  10.         printf("Unknown Endian\n");
  11.     }

  12.     return 0;
  13. }

解释:
这段代码将 int 类型的 num 变量的地址通过指针 bytePointer 以 char* 类型读取,然后检查第一个字节的值。
根据字节顺序,bytePointer[0] 可以判断系统是小端序还是大端序。
 楼主| 598330983 发表于 2024-9-28 12:20 | 显示全部楼层
方法 3:位段结合指针
可以使用位段来定义结构体,并使用指针检查位段的排列顺序,类似于前述的联合体方法。

示例代码:
  1. #include <stdio.h>

  2. struct BitField {
  3.     unsigned int a : 8;
  4.     unsigned int b : 8;
  5.     unsigned int c : 8;
  6.     unsigned int d : 8;
  7. };

  8. int main() {
  9.     struct BitField test;
  10.     test.a = 0x12;
  11.     test.b = 0x34;
  12.     test.c = 0x56;
  13.     test.d = 0x78;

  14.     unsigned char *bytePointer = (unsigned char *)&test;

  15.     // 打印结构体的字节顺序
  16.     printf("Byte order: %02x %02x %02x %02x\n", bytePointer[0], bytePointer[1], bytePointer[2], bytePointer[3]);

  17.     return 0;
  18. }

 楼主| 598330983 发表于 2024-9-28 12:20 | 显示全部楼层
方法 4:使用系统自带的宏
在某些平台上,可以通过一些系统或库自带的宏直接判断字节序。例如,POSIX 标准系统通常有 __BYTE_ORDER__ 或 __LITTLE_ENDIAN__ 等宏。

示例代码(C/C++):
  1. #include <stdio.h>
  2. #include <endian.h>

  3. int main() {
  4.     #if __BYTE_ORDER == __LITTLE_ENDIAN
  5.         printf("Little Endian\n");
  6.     #elif __BYTE_ORDER == __BIG_ENDIAN
  7.         printf("Big Endian\n");
  8.     #else
  9.         printf("Unknown Endian\n");
  10.     #endif

  11.     return 0;
  12. }
 楼主| 598330983 发表于 2024-9-28 12:21 | 显示全部楼层
最后最重要的就是你要知道什么是大小端。
总结
小端序(Little Endian):最低有效字节存储在低地址(内存顺序为从低位到高位)。
大端序(Big Endian):最高有效字节存储在低地址(内存顺序为从高位到低位)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部