对真实文件进行霍夫曼编码压缩

问题描述 投票:0回答:1

在现实生活中实现霍夫曼编码时需要帮助。我有一个文本文件,其中包含随机单词和字符。如果我将字符替换为相应的可变长度位 [例如:a 替换为 110],则同一文件会将 110 视为 3 个字符并使用 24 位来存储 110。

所以,无法理解如何在真实文件上执行此操作并减小文件大小。我是否必须将这些编码位以不同的格式存储在单独的文件中?如果是,需要做什么才能真正减少文件大小

algorithm encoding compression huffman-code lossless-compression
1个回答
0
投票

您似乎想要将输入文件(充满零和一(即 0 和 1)的文本文件)转换为二进制文件。

将此用作

input.txt

00000000 00000001 # comment and new line
11111111 10000000 10000001

您可以使用这个小

bash
脚本将其制作成5字节的输出文件:

#!/bin/bash

# https://stackoverflow.com/q/78904748/2836621

# Pick up parameters
#  first parameter is input file, which defaults to "input.txt"
#  second parameter is output file, which defaults to "output.bin"
INPUTFILE=${1:-"input.txt"}
OUTPUTFILE=${2:-"output.bin"}

# Delete everything that is not 0 or 1 in input file
# Make lines of 4 zeroes and ones, i.e. nybbles
# pass to awk to make each nybble into a hex digit using a lookup table
# Reconstruct binary file from hex stream with "xxd"
tr -dC "01" < "$INPUTFILE" | fold -s4 | awk '
   BEGIN { lkup["0000"]="0"; lkup["0001"]="1"; lkup["0010"]="2"; lkup["0011"]="3"
           lkup["0100"]="4"; lkup["0101"]="5"; lkup["0110"]="6"; lkup["0111"]="7"
           lkup["1000"]="8"; lkup["1001"]="9"; lkup["1010"]="A"; lkup["1011"]="B"
           lkup["1100"]="C"; lkup["1101"]="D"; lkup["1110"]="E"; lkup["1111"]="F"
   }
   { printf(lkup[$0]) } ' | xxd -r -p > "$OUTPUTFILE"

将上述内容保存在您的 HOME 目录中为

text2bin
,然后使用以下命令使其可执行:

chmod +x $HOME/text2bin

然后您可以使用以下命令从任何目录运行它:

$HOME/text2bin INPUTFILE OUTPUTFILE

如果您在 macOS 上使用 TexEdit 创建脚本,请务必按 T 使其成为 “纯文本”

© www.soinside.com 2019 - 2024. All rights reserved.