如何无需Python,优雅输出文件的原始二进制表示?
无Python依赖的文件纯二进制字符串输出方法
需求是直接输出文件的纯二进制表示(每个字节转换为8位二进制字符,无任何偏移、注释或额外格式),比如对内容为This is some text的文件a.txt,要得到连续的01串。目前用Python可以实现,但希望找到不依赖Python的更简洁方案——xxd的-p参数能输出纯十六进制,但-b(二进制输出)和-p不兼容,hexdump也没有直接的纯二进制输出选项。
以下是几种可行的无Python方案:
方案1:使用od + awk
od可以输出文件的字节数值,配合awk将每个数值转为8位二进制:
od -An -vtu1 a.txt | awk '{for(i=1;i<=NF;i++) printf "%08d", strtonum("0x" $i)}'
od -An -vtu1:-An隐藏地址列,-v显示所有重复字节(不省略),-tu1以无符号单字节格式输出每个字节的十进制值awk遍历每个十进制值,转成8位二进制并拼接输出
方案2:使用hexdump + awk
先让hexdump输出每行一个字节的十六进制,再用awk转成二进制:
hexdump -v -e '/1 "%02X\n"' a.txt | awk '{printf "%08d", strtonum("0x" $0)}'
hexdump -v -e '/1 "%02X\n"':-v不省略重复行,-e指定格式,每个字节输出为两位十六进制后换行awk将每行的十六进制转为8位二进制并拼接
方案3:纯Bash实现(无需额外工具)
利用Bash的内置命令处理,适合没有od/hexdump的环境:
while IFS= read -r -n1 byte; do printf "%08d" "$(( $(printf '%d' "'$byte") ))" done < a.txt
read -r -n1每次读取一个字节printf '%d' "'$byte"将字符转为对应的ASCII/字节值printf "%08d"将数值格式化为8位二进制字符串
验证
以上方案的输出结果均与Python命令的输出一致,比如对a.txt会输出:
0101010001101000011010010111001100100000011010010111001100100000011100110110111101101101011001010010000001110100011001010111100001110100
内容的提问来源于stack exchange,提问作者Jay Mody
相关产品推荐
相关产品推荐

