преобразовать массив байтов в целое число - PullRequest
0 голосов
/ 10 июня 2018

Я работаю над проектом IJVM с использованием языка Си.Сначала я импортировал двоичный файл в свою программу, который должен быть проанализирован как слова.Теперь я создал переменную (текст), которая содержит двоичный файл, и мне нужно преобразовать его в массив слов.Я получил подсказку

    int result = ((bytes[0] & 0xFF) << 24) |
    ((bytes[1] & 0xFF) <<16) |
    ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);

Это работало только для первых 4 байтов, мне нужен массив result.

Я пробовал что-то подобное, но это никогда не работало.. :(

void type_converter(byte_t* text)
{
  for (int i = 0; i < sizeof(text)/4; i++) {
    for (int j = 0; i < sizeof(text)/4; i++) {

      int result[i] = ((text[j+0] & 0xFF) << 24) |
      ((text[j+1] & 0xFF) << 16) |
      ((text[j+2] & 0xFF) << 8) | (text[j+3] & 0xFF);
      instruction[i] = result;
      j =+ 4;
    }
  }

1 Ответ

0 голосов
/ 10 июня 2018

Пример кода OP:

  • Внутренний цикл не имеет смысла (или я не понял намерения).

  • Внешний цикл я бы изменил на: for (int i = 0; i + 3 < size; i += 4).Пожалуйста, обратите внимание на i + 3.Это делает цикл безопасным от частичного количества байтов в конце буфера.i += 4 делает соответствующий шаг в 4 байтовых скачках.

  • size - это то, что вы должны предоставить.Как уже упоминал Мартин: sizeof text предоставляет размер указателя.Нет возможности определить это оператором (если у вас нет прямого доступа к исходному массиву).Вы должны сделать параметр size для этого.(Это очень распространенное решение в программах на Си.)

  • Кстати.для result или instruction нет декларации.Следовательно, я бы сделал один из них в качестве другого параметра функции.

Итак, ваша функция изменения может выглядеть так:

void type_converter(uint32_t *result, byte_t *text, size_t size)
{
  for (size_t i = 0; i + 3 < size; i += 4) {
    result[i / 4]
      = ((text[i+0] & 0xFF) << 24)
      | ((text[i+1] & 0xFF) << 16)
      | ((text[i+2] & 0xFF) << 8)
      | (text[i+3] & 0xFF);
    }
  }
}

И, пожалуйста, обращайтесьне забывайте, что result должен обеспечить достаточно памяти для size / 4 uint32_t слов.


Поскольку я только что вспомнил, как я делал подобные вещи в прошлом, это может быть немного измененодля предотвращения i + 3 в состоянии петли:

void type_converter(uint32_t *result, byte_t *text, size_t size)
{
  for (size_t i = 3; i < size; i += 4) {
    result[i / 4]
      = ((text[i-3] & 0xFF) << 24)
      | ((text[i-2] & 0xFF) << 16)
      | ((text[i-1] & 0xFF) << 8)
      | (text[i] & 0xFF);
    }
  }
}

Прямая демонстрация на wandbox

Примечание:

Я только что понял, что такая комбинация байтов предназначена для чисел с прямым порядком байтов (старший байт в первой позиции).Для little-endian индексы нужно было переупорядочить.

...