如何从八进制转储构建文件?解析od输出还原原二进制文件
解析od输出并重建原始二进制文件的方法
一、用od自身反向还原
GNU od自带反向读取功能,可直接解析自身输出并还原原始内容:
# 还原为文本格式 od -v -An -t o2 od.version.txt | od -v -An -t c -r # 还原为二进制文件 od -v -An -t o2 od.version.txt | od -v -An -t x1 -r > restored.bin
解释:第一个od提取所有八进制数值(忽略地址标记和换行),第二个od通过-r开启反向解析,-t c指定输出为字符格式,-t x1则输出十六进制字节。
二、用xxd结合脚本实现
xxd默认处理十六进制,可先将od的八进制输出转换为十六进制,再用xxd还原:
awk '{for(i=2;i<=NF;i++) printf "%04x ", strtonum("0"$i)}' od.version.txt | xxd -r -p > restored.txt
解释:awk遍历每行的八进制数(跳过开头的地址字段),将其转换为4位十六进制(对应2字节),再通过xxd -r -p读取十六进制流并还原为原始二进制。
三、用Python脚本实现
通过Python直接解析od输出,拆分每个八进制数为对应字节并写入文件:
with open('od.version.txt', 'r') as f_in, open('restored.txt', 'wb') as f_out: for line in f_in: tokens = line.strip().split() if not tokens: continue # 跳过地址字段,处理每个八进制数值 for oct_str in tokens[1:]: # 补前导零确保是6位八进制格式 oct_str = oct_str.zfill(6) # 拆分为两个3位八进制的字节 byte1 = int(oct_str[:3], 8) byte2 = int(oct_str[3:], 8) f_out.write(bytes([byte1, byte2]))
运行脚本后,restored.txt即为还原后的原始文本。
四、用Awk脚本实现
用Awk拆分八进制数并输出对应字符:
#!/usr/bin/awk -f { for (i=2; i<=NF; i++) { # 补前导零到6位 oct_full = sprintf("%06s", $i) # 拆分前后3位八进制,转换为字节 byte1 = strtonum("0" substr(oct_full, 1, 3)) byte2 = strtonum("0" substr(oct_full, 4, 3)) # 输出字符 printf "%c%c", byte1, byte2 } }
保存为od-restore.awk,执行以下命令还原:
awk -f od-restore.awk od.version.txt > restored.txt
内容的提问来源于stack exchange,提问作者mvanle
相关产品推荐
相关产品推荐

