说我有一个char指针,我想将其放入一个具有16个字符的char数组(即使char指针的strlen()大于该字符,然后截断),也很简单,我只是这样做:
char* pointer = <insert whatever here>;
unsigned char myArray[16];
memcpy(myArray, pointer, 16);
现在,我想将char数组放入一个16字节的u_int32_t数组中。
这是我正在尝试的:
u_int32_t newArray[4];
memcpy(newArray, myArray, 16);
这似乎并没有像我想要的那样复制字节。我在这里缺少一些基本的C步骤吗?
我应该将char数组放入u_int32_t数组中吗?
答案 0 :(得分:1)
您可能需要了解指针算术。当声明类型为uint32_t的数组时,编译器将自动执行魔术操作以按4个字节的顺序执行增量。请参阅下面的示例
#include <stdio.h>
#include<string.h>
#include<stdint.h>
char* pointer = "HelloWorld!Hell!";
uint32_t arr[4];
unsigned char myArray[16];
int main(void) {
memcpy(arr, pointer, (size_t)16);
//Generates warning but still works, because format is an indication to printf
// how to deal with this array.
printf("%s\n", arr);
char *arr1 = (char *)arr;
for(int i = 0 ; i < 16; i++)
{
printf("arr[%d]=%c\n", i, arr1[i]);
}
}
答案 1 :(得分:1)
似乎memcpy
可以工作(可能是注释中提到的一些字节序问题),但是如果可以的话,也可以使用循环。
#include <stdio.h>
#include <string.h>
#include <stdint.h>
int main()
{
char arr[16] = {1, -2, 3, -4, 5, -6, 7, -8, 9, -10, 11, -12, 13, -14, 15, -16};
uint32_t newArray[4];
uint32_t otherArray[4];
memcpy(newArray, arr, 16);
for (int i = 0; i < 4; i++)
printf("%d %d %d %d ", (char)(newArray[i] & 0xFF),
(char)((newArray[i] & 0xFF00) >> 8),
(char)((newArray[i] & 0xFF0000) >> 16),
(char)((newArray[i] & 0xFF000000) >> 24));
putchar('\n');
// Copy via loop using bitwise OR and shifting
for (int i = 0; i < 16; i += 4)
otherArray[i / 4] = (((uint32_t)arr[i + 3]) << 24) & 0xFF000000 |
(((uint32_t)arr[i + 2]) << 16) & 0xFF0000 |
(((uint32_t)arr[i + 1]) << 8) & 0xFF00 |
(uint32_t)arr[i];
for (int i = 0; i < 4; i++)
printf("%d %d %d %d ", (char)(otherArray[i] & 0xFF),
(char)((otherArray[i] & 0xFF00) >> 8),
(char)((otherArray[i] & 0xFF0000) >> 16),
(char)((otherArray[i] & 0xFF000000) >> 24));
return 0;
}
输出
1 -2 3 -4 5 -6 7 -8 9 -10 11 -12 13 -14 15 -16
1 -2 3 -4 5 -6 7 -8 9 -10 11 -12 13 -14 15 -16