我正在尝试将无符号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));
}
虽然不起作用。怎么了,我该怎么做?
答案 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);
}
我认为这是一个更优雅的解决方案。