Копирование массива без знака в uint32_t и наоборот - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь итеративно скопировать массив без знака в переменную 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));
}

Это не работает, хотя.Что не так и как мне добиться того, что я хочу сделать?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

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

На мой взгляд, это более элегантное решение.

0 голосов
/ 06 декабря 2018

Проблема в том, что вы добавляете 4 к i с каждой итерацией и , умножая на 4. Вы должны использовать byteArray + i.

Также, как указывало @WeatherVaneниже ваш цикл будет более соответствовать sizeof ():

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

...