C小端但产生大端结果?
C little endian but produce big endian result?
我刚刚在 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);
}
我得到的结果是little 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;
现在我很困惑我的 raspberry pi 是小端还是大端?
此外,我要通过套接字传递这些数据,所以我需要确保它是网络字节顺序还是只要我标准化了我要使用的字节序就可以了在我尝试与之通信的所有设备上?
PS。另外,如果我需要手动将整数数组中的所有整数从小端转换为大端,我应该怎么做?我在网上找到的大多数解决方案都是只转换整数而不是整数数组。
int num = 170; // suppose to give 0000 0000 0000 00AA
没有。它应该给你 AA, 00, 00, 00
(或者 AA, 00, 00, 00, 00, 00, 00, 00
如果 int
是 64 位)。
在小端布局中,最低有效字节存储在最低地址. 0x000000AA
(170) 的最低有效字节是 0xAA
.
两种情况下都是小端。
在你的第一种情况下,最低有效字节是 2,它匹配 c[0] - little-endian。
在你的第二种情况下,最低有效字节为 170(所有其他字节为零)并且匹配 c[0] - little-endian。
如果您是通过套接字复制数据,那么您只需要确保数据格式一致即可。不管它是什么。
复制一个数据数组,和单个项目一样,重复一遍。
我刚刚在 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);
}
我得到的结果是little 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;
现在我很困惑我的 raspberry pi 是小端还是大端?
此外,我要通过套接字传递这些数据,所以我需要确保它是网络字节顺序还是只要我标准化了我要使用的字节序就可以了在我尝试与之通信的所有设备上?
PS。另外,如果我需要手动将整数数组中的所有整数从小端转换为大端,我应该怎么做?我在网上找到的大多数解决方案都是只转换整数而不是整数数组。
int num = 170; // suppose to give 0000 0000 0000 00AA
没有。它应该给你 AA, 00, 00, 00
(或者 AA, 00, 00, 00, 00, 00, 00, 00
如果 int
是 64 位)。
在小端布局中,最低有效字节存储在最低地址. 0x000000AA
(170) 的最低有效字节是 0xAA
.
两种情况下都是小端。
在你的第一种情况下,最低有效字节是 2,它匹配 c[0] - little-endian。
在你的第二种情况下,最低有效字节为 170(所有其他字节为零)并且匹配 c[0] - little-endian。
如果您是通过套接字复制数据,那么您只需要确保数据格式一致即可。不管它是什么。
复制一个数据数组,和单个项目一样,重复一遍。