Пример кода 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 индексы нужно было переупорядочить.