将未签名的char数组复制到uint32_t,反之亦然

时间:2018-12-06 10:07:03

标签: c memcpy

我正在尝试将无符号char数组迭代复制到uint_32t变量(以4字节块为单位),对uint_32t变量执行一些操作,然后将其复制回无符号char数组。

这是我的代码:

unsigned char byteArray[len]
for (int i=0; i<len; i+=4) {
  uint32_t tmpInt = 0;
  memcpy(&tmpInt, byteArray+(i*4), sizeof(uint32_t));
  // do some operation on tmpInt here
  memcpy((void*)(byteArray+(i*4)), &tmpInt, sizeof(uint32_t));
}

虽然不起作用。怎么了,我该怎么做?

2 个答案:

答案 0 :(得分:4)

问题是您要为i加4,每次迭代乘以4。您应该使用byteArray + i

此外,正如@WeatherVane在下面指出的那样,您的循环将与sizeof()更一致:

for (int i = 0; i < len; i += sizeof(uint32_t))

答案 1 :(得分:2)

正如其他人指出的那样,您可以通过增加i并将其乘以目标大小来做很多事情。

在此

  • 显示的代码可能会遇到缓冲区溢出问题,超出了源数组的范围。
  • sizeof运算符的求值为size_t,而不是int
  • 代码重复多次独立地定义目标的大小。

修复所有结果可能如下所示:

  unsigned char byte_array[len];

  typedef uint32_t target_type;
  const size_t s = sizeof (target_type);

  for (size_t i = 0; i < (len/s)*s; i += s) {
    target_type target;
    memcpy(&target, byte_array + i, s);

    // do some operation on target here

    memcpy(byte_array + i, &target, s);
  }

要避免typedef,只需在for循环的外面定义目标:

  unsigned char byte_array[len];

  {
    uint32_t target;
    const size_t s = sizeof target;

    for (size_t i = 0; i < (len/s)*s; i += s) {
      memcpy(&target, byte_array + i, s);

      // do some operation on target here

      memcpy(byte_array + i, &target, s);
    }
  }

等同于

byte_array + i

将会

&byte_array[i]

阅读起来可能更直观。

要避免出现“奇怪的” (len/s)*s,可以完全不使用索引,而要使用指针:

    for (unsigned char p = byte_array; p < byte_array + len; p += s) {
      memcpy(&target, p, s);

      // do some operation on target here

      memcpy(p, &target, s);
    }

我认为这是一个更优雅的解决方案。