我在我的机器上编写了一个C程序,其中以下部分是代码:
uint32_t test = 0x01020304;
uint8_t array[4];
memcpy(array, &test, 4);
printf("%02x %02x %02x %02x\n",array[0], array[1], array[2], array[3]);
它打印出 04030201
,但我期望得到的是 01020304
。
我需要得出结论:我所使用的机器具有小端字节序架构吗?
我在我的机器上编写了一个C程序,其中以下部分是代码:
uint32_t test = 0x01020304;
uint8_t array[4];
memcpy(array, &test, 4);
printf("%02x %02x %02x %02x\n",array[0], array[1], array[2], array[3]);
它打印出 04030201
,但我期望得到的是 01020304
。
我需要得出结论:我所使用的机器具有小端字节序架构吗?
htonl()
和相关函数非常重要。(请不要重新实现这些函数。)a << n
被定义为将a
乘以2的n
次方所得到的相同值。有些情况下,位移操作会导致未定义/未指定的行为,但这与字节顺序无关。还有一些中间端和混合端的机器存在。 - Peter<<
将字节向右移位,如果您按传统方式将内存内容写在左侧的较低地址处。 - Peter - Reinstate Monica我需要得出结论,我所使用的机器是小端架构吗?
是的。
请考虑以与字节序无关的方式复制和打印数据:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
int main ()
{
uint32_t test = 0x01020304;
uint8_t array[4];
for(size_t i=0; i<sizeof(uint32_t); i++)
{
size_t shift = 8 * (sizeof(uint32_t) - 1 - i);
array[i] = (test >> shift) & 0xFF;
printf("%.2" PRIx8 " ", array[i]);
}
return 0;
}
memcpy(array, test, 4);
还是memcpy(array, &test, 4);
(注意第二个上的&
)? 第二个例子是正确的,不应该给你一个警告。 - Andrew Henle