C小端但产生大端结果?

时间:2016-02-29 12:11:38

标签: c endianness

我刚刚在Raspberry Pi上做了一个小实验我正在使用以下代码:

//tutorialspoint.com/unix_sockets/network_byte_orders.htm

#include <stdio.h>

int main(int argc, char **argv) {

   union {
      short s;
      char c[sizeof(short)];
   }un;

   un.s = 0x0102;

   if (sizeof(short) == 2) {
      if (un.c[0] == 1 && un.c[1] == 2)
         printf("big-endian\n");

      else if (un.c[0] == 2 && un.c[1] == 1)
         printf("little-endian\n");

      else
         printf("unknown\n");
   }
   else {
      printf("sizeof(short) = %d\n", sizeof(short));
   }

   exit(0);
}

我得到的结果是小端

现在当我将一个整数转换为字节数组时,结果出现在big endian

unsigned char c[4];
int num = 170; // suppose to give 0000 0000 0000 00AA
memcpy(c, (char*)&num, sizeof(int));
printf("c[0] = %04x \n", c[0]);
printf("c[1] = %04x \n", c[1]);
printf("c[2] = %04x \n", c[2]);
printf("c[3] = %04x \n", c[3]);
memcpy((char *)&num, c, sizeof(int));
printf("%d\n", ntohl((long)num));

输出:

c [0] = 00aa

c [1] = 0000

c [2] = 0000

c [3] = 0000

-1442840576

为了让它变成小端,我不得不做一个转变

//c[0] = (num >> 24) & 0xFF;
//c[1] = (num >> 16) & 0xFF;
//c[2] = (num >> 8) & 0xFF;
//c[3] = num & 0xFF;

现在我很困惑,如果我的覆盆子pi是小端还是大端?

另外,我将通过套接字传递这些数据,所以我需要确保它是网络字节顺序还是可以,只要我标准化我将要使用的所有端点我试图与之沟通的设备?

PS。另外,如果我需要手动将整数数组中的所有整数从小端转换为大端,我应该采取什么方法?我在网上找到的大多数解决方案只是转换整数而不是整数数组。

2 个答案:

答案 0 :(得分:4)

这两种情况都是小端的。

在第一种情况下,最低有效字节为2,与c [0]匹配 - little-endian。

在第二种情况下,最低有效字节为170(所有其他字节为零)并且匹配c [0] - little-endian。

如果要通过套接字复制数据,则只需确保数据格式一致。它并不重要。

要复制数据数组,只需执行与单个项目相同的操作,但重复一遍。

答案 1 :(得分:1)

int num = 170; // suppose to give 0000 0000 0000 00AA

没有。如果AA, 00, 00, 00是64位,它应该给你AA, 00, 00, 00, 00, 00, 00, 00(或int。)在小端布局中,最低有效字节存储在最低的地址。 0x000000AA(170)的最低有效字节为0xAA