использование BCL для сжатия файлов - PullRequest
0 голосов
/ 30 апреля 2018

4,5 Huffman_Compress

Syntax:

outsize = Huffman_Compress(in,out,insize)

outsize Size of output buffer after compression
in Pointer to the input buffer (uncompressed data)
out Pointer to the output buffer (compressed data)
insize Size of input buffer
The output buffer must be able to hold insize * 101 / 100 + 320 bytes.

4.6 Huffman_Uncompress Синтаксис:

Huffman_Uncompress (в, из, insize, большие размеры)

in Pointer to the input buffer (compressed data)
out Pointer to the output buffer (uncompressed data)
insize Size of input buffer
outsize Size of output buffer
The output buffer must be able to hold outsize bytes

Какой размер выходного буфера следует использовать? Я пытался найти некоторые примеры, но ничего не нашел

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

С некоторой дополнительной информацией о Huffman_Compress можно будет определить максимальную степень сжатия и накладные расходы. При этом вы можете рассчитать максимально возможное расширение за счет декомпрессии и соответственно выделить буфер вывода. Однако вам не понравится ответ для больших сжатых входных данных.

Поскольку кажется, что декомпрессия должна быть завершена за один вызов, вы должны отправить несжатую длину со сжатыми данными. Просто добавьте сжатые данные, скажем, в восемь байтов, содержащих несжатую длину. На другом конце прочитайте длину в восемь байтов, выделите буфер такого размера и распакуйте остаток в этот буфер.

0 голосов
/ 30 апреля 2018

Похоже, ваша библиотека обрабатывает только данные в памяти, основанные на том, что вы опубликовали. Это может быть в состоянии делать данные на основе файлов, но это совсем не ясно из того, что вы предоставили.

Следовательно, вам, вероятно, потребуется сделать следующее:

  • чтение файла в буфер в памяти;
  • выделить другую (сжатую) область буфера, на 1% больше с дополнительными 320 байтами;
  • вызов функции для преобразования обычного буфера памяти в сжатый буфер;
  • записать сжатый буфер в другой файл (количество для записи зависит от outsize, возвращаемого функцией).

Если вы хотите иметь возможность обрабатывать входные файлы произвольного размера, не беспокоясь о возможности нехватки памяти для буферов, вы можете «разделить» входные данные на (например) 64 569-байтовые куски.

Для этого потребуется входной буфер объемом 64 569 байт, выходной буфер размером 65 535 байт (64 569 * 1,01 + 320, округленный в большую сторону) и способ хранения этих блоков, чтобы вы могли получить их отдельно для декомпрессии.

Например, вам может потребоваться записать 16-разрядный без знака outsize (теперь вы понимаете, почему я выбрал размер ввода 64 569, чтобы ограничить outsize 16-разрядным значением), за которым следует такое количество байтов данных для каждого отдельного куска.

Сжатие, вероятно, будет немного меньше, поскольку вы периодически перезапускаете дерево Хаффмана, но оно все равно должно быть разумно близко к тому, что вы получили бы, если бы делали весь файл сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...