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