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

  • 本文关键字:数组 16字节 int32 char 字符 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数组?

您可能需要了解指针算术。当您声明一个类型为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 

相关内容

  • 没有找到相关文章

最新更新