将 unsigned char 数组复制到 uint32_t,反之亦然
Copying unsigned char array to uint32_t, and vice versa
我正在尝试将一个无符号字符数组迭代复制到一个 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);
}
在我看来这是一个更优雅的解决方案。
我正在尝试将一个无符号字符数组迭代复制到一个 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);
}
在我看来这是一个更优雅的解决方案。