Код C для сжатия и распаковки строки
Мне нужно сжать этот вывод :
AE9B56FC5845AC8298FFC57E307145A4
а потом мне нужно распаковаться, чтобы вернуться обратно.
Что я уже пробовал:
Мне нужно сжать этот вывод :
AE9B56FC5845AC8298FFC57E307145A4
а длина должна быть меньше 24 бит >>
enhzflep
zlib будет "сжимать" эти 16 байт до 19 байт.
Простое арифметическое кодирование создает 18 байт выходных данных
Хаффман с умным представлением дерева возвращает 11 байт выходных данных
*** Хаффман without
включенное дерево возвращает 3 байта ***
winRar возвращает вам 91 байт.
TLDR; кажется, что вы пытаетесь толкнуть 💩 вверх по холму своим носом, ожидая, что он будет блестящим и пахнущим розами, когда вы достигнете вершины!
Хотя вы можете жестко закодировать дерево Хаффмана и получить обратно всего 3 байта-дерево будет отличаться для разных входных данных, так что эта идея в основном не является стартовой.
zlib может использовать заранее определенное дерево, но выход не будет таким маленьким, так как он строит полное дерево, а затем использует коды длиннее оптимального (для этого случая использования) из-за того, что он имеет 256 листовых узлов, а не только 16.
Посмотрите на puff.c от Марка Адлера, если вам нужен относительно простой источник hufman для просмотра. (он находится в источниках zLib) просто не ожидайте чудес!