假设我有一个存储8位整数的数组。如何从输入中读取32位整数并将其存储在数组的4个连续位置中?例如...
uint8_t * myArray = malloc(1024 * sizeof(uint8_t) );
scanf("%x", &myArray[0]);
for (int i = 0; i < 4; i++)
printf("0x%02x\n"); // %02x prints an integer in HexaDecimal format with 2 0's padding to the left
INPUT:
0xAABBCCDD
OUTPUT:
0xDD
0xCC
0xBB
0xAA
明白吗?我希望不要将数据的最高有效位分散到以下位置。我怎样才能做到这一点?我知道它与指针算术有关,但我只是不知道是什么。
答案 0 :(得分:3)
您所拥有的代码现在只要修复printf语句即可在C中按您希望的方式实际运行:
从此:
printf("0x%02x\n");
对此:
printf("0x%02x\n", myArray[i]);
我认为您可以使用%x
作为格式说明符(它是无符号int)来怀疑您的scanf语句,但是&myArray[0]
是字节指针。读入字节地址的4字节将溢出到接下来的3个字节中,这是分配的数组的一部分。
我可能将其编码如下:
uint32_t * myArray = malloc(256 * sizeof(uint32_t));
uint8_t* myByteArray = (uint8_t*)myArray;
scanf("%x", &myArray[0]);
for (int i = 0; i < 4; i++)
printf("0x%02x\n", myByteArray[i]);
如果您想成为纯粹主义者而不是依靠指针黑客。假设您所暗示的是一点尾数语义:
uint32_t* myArray = malloc(256 * sizeof(uint32_t));
scanf("%x", &myArray[0]);
for (int i = 0; i < 4; i++)
{
uint32_t val = ((myArray[i/4] >> (i*8)) & 0x000000ff;
printf("0x%02x\n", (unsigned int)(val));
}