在现实生活中实现霍夫曼编码时需要帮助。我有一个文本文件,其中包含随机单词和字符。如果我将字符替换为相应的可变长度位 [例如:a 替换为 110],则同一文件会将 110 视为 3 个字符并使用 24 位来存储 110。
所以,无法理解如何在真实文件上执行此操作并减小文件大小。我是否必须将这些编码位以不同的格式存储在单独的文件中?如果是,需要做什么才能真正减少文件大小
您似乎想要将输入文件(充满零和一(即 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 使其成为 “纯文本”。