假设我有一个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数组?
您可能需要了解指针算术。当您声明一个类型为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("%sn", arr);
char *arr1 = (char *)arr;
for(int i = 0 ; i < 16; i++)
{
printf("arr[%d]=%cn", i, arr1[i]);
}
}
看起来memcpy
是有效的(可能是注释中提到的一些endiannes问题(,但如果愿意,也可以使用循环。
#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