Top.Mail.Ru
Ответы

Как объеденить массив байт в целочисленный тип int для последующей работы с ним

Пишу редактор сохранений для NFS:MW. Пока что работаю над проверкой на валидность файла, но на этом моменте уже возникли проблемы. У меня есть массив Magic_Bytes[4];, а так же строка save.read(Magic_Bytes, 4); записывающая магические байты в массив. Мне как то нужно перевести массив из 4х байт в целую переменную int в порядке little-endian, что бы сравнить ее с магическим числом.

По дате
По рейтингу
Аватар пользователя
Новичок

Для объединения массива байтов в целочисленный тип int с учетом порядка байтов little-endian, вы можете использовать следующий код на C++:

123456789101112131415
 #include <iostream> 
#include <cstdint> 
 
int main() { 
    // Ваш массив байтов, который нужно объединить в int 
    uint8_t Magic_Bytes[4] = {0x78, 0x56, 0x34, 0x12}; 
 
    // Объединяем байты в переменную типа int с учетом порядка little-endian 
    int32_t magic_int = Magic_Bytes[0] | (Magic_Bytes[1] << 8) | (Magic_Bytes[2] << 16) | (Magic_Bytes[3] << 24); 
 
    // Выводим результат 
    std::cout << "Magic integer: " << std::hex << magic_int << std::endl; // Вывод: Magic integer: 12345678 
 
    return 0; 
} 

В этом коде используется побитовое ИЛИ и сдвиг влево для объединения байтов в переменную типа int32_t. Важно использовать тип uint8_t для массива байтов и int32_t для результата, чтобы гарантировать корректный размер типов данных на разных платформах.

Теперь вы можете сравнить переменную magic_int с вашим магическим числом для проверки на валидность файла.

Аватар пользователя
Мудрец

Держи! Всё уже объединено.

union MAGIC_BYTES {
uint32_t num;
uint8_t byte[4];
} Magic;

Для сложных структур может понадобиться ещё #pragma pack(1) ибо иначе компилер тебе выравняет структуру (и каждый элемент) по границе 4 байт.