Как уже отмечали другие, вы делаете много, увеличивая 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);
}
На мой взгляд, это более элегантное решение.