двоичные файлы — Как назначить только 16 бит для любого целого числа в двоичном файле вместо нормального 32 в C ++?

У меня есть программа для создания сжатого файла с использованием алгоритма LZW и использования хеш-таблиц. Мой сжатый файл в настоящее время содержит целые числа, соответствующие индексу хеш-таблицы.
Максимальное целое число в этом сжатом файле составляет около 46000, что может быть легко представлено 16 битами.
Теперь, когда я конвертирую этот «compressfile.txt» в двоичный файл «binary.bin» (чтобы еще больше уменьшить размер файла), используя следующий код, я получаю 32-битные целые числа в моем файле «binary.bin». Например. если в моем сжатом файле есть число 84, оно конвертируется в 5400 0000 в моем двоичном файле.

std::ifstream in("compressedfile.txt");
std::ofstream out("binary.bin", ios::out | std::ios::binary);

int d;
while(in >> d)
{out.write((char*)&d, 4);}

У меня вопрос: не могу ли я выбросить окончание ‘0000’ в ‘5400 0000’, которое занимает в моем файле лишние 2 байта. Это имеет место с каждым целым числом, так как мое максимальное целое число составляет 46000, которые могут быть представлены с использованием только 2 байтов. Есть ли код, который может установить базу моего бинарного файла таким образом? Я надеюсь, что мой вопрос ясен.

0

Решение

Он записывает именно то, что вы говорите, 4 байта по адресу d (целое число, 32 бита на многих платформах). Используйте 16-битный тип и запишите вместо него 2 байта:

uint16_t d; // unsigned to ensure it's large enough to hold your max value of 46000
while (in >> d) out.write(reinterpret_cast<char*>(&d), sizeof d);

Редактировать: Как указано в комментариях, для того, чтобы этот код и данные, которые он генерирует, были переносимыми между архитектурами процессоров, вы должны выбрать для вывода соглашение о порядке байтов. Я бы предложил использовать htons () преобразовать ваш uint16_t в сетевой порядок байтов, который широко доступен, хотя и не является (пока) частью стандарта C ++.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]