У меня есть программа для создания сжатого файла с использованием алгоритма 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 байтов. Есть ли код, который может установить базу моего бинарного файла таким образом? Я надеюсь, что мой вопрос ясен.
Он записывает именно то, что вы говорите, 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 ++.
Других решений пока нет …