c语言 - 将无符号字符数组复制到uint32_t,反之亦然



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

这是我的代码:

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));
}

不过它不起作用。出了什么问题,我怎样才能实现我想做的事情?

问题是您在每次迭代时将 4 添加到i乘以 4。您应该使用byteArray + i.

另外,正如下面@WeatherVane指出的,你的循环会与 sizeof() 更一致:

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

正如其他人指出的那样,您通过增加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);
}

在我看来,这是一个更优雅的解决方案。

最新更新