如何将16字节char数组的字符放入16字节u_int32_t数组中?

时间:2020-03-07 18:17:44

标签: c

说我有一个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数组中吗?

2 个答案:

答案 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