gpt4 book ai didi

C小端但产生大端结果?

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:43 24 4
gpt4 key购买 nike

我刚刚在我正在使用以下代码的 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;

现在我很困惑我的树莓派是小端还是大端?

此外,我要通过套接字传递这些数据,所以我需要确保它是网络字节顺序还是只要我标准化了我将在所有系统中使用的字节序就可以了?我尝试与之通信的设备?

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

最佳答案

两种情况下都是小端。

在您的第一种情况下,最低有效字节是 2 并且匹配 c[0] - little-endian。

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

如果您通过套接字复制数据,那么您只需要确保数据格式一致即可。它是什么并不重要。

对于复制一个数组的数据,只需做与单个项目相同的事情,但要重复。

关于C小端但产生大端结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35699239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com