如何用Shell及常用命令行工具实现多类型结构体的类od输出?
处理混合数据类型的二进制元组文件
当然可以实现,下面提供两种实用方案,基于常用命令行工具:
方案一:用Python一行命令(推荐)
Python的struct模块可以轻松解析混合类型的二进制数据,灵活性高且代码简洁。针对你提到的1字节无符号整数+4字节浮点数+2字节有符号整数的元组结构,执行以下命令:
python3 -c "import sys, struct; fmt='<Bfh'; chunk_size=struct.calcsize(fmt); raw_data=sys.stdin.read(); for offset in range(0, len(raw_data), chunk_size): print(','.join(map(str, struct.unpack(fmt, raw_data[offset:offset+chunk_size]))))" < your_binary_file.bin
关键参数说明:
fmt='<Bfh':定义元组的结构和字节序<:小端字节序(如果你的文件是大端,替换为>即可)B:1字节无符号整数(对应u1)f:4字节浮点数(对应f4)h:2字节有符号整数(对应d2)
chunk_size:自动计算单个元组的总字节数(1+4+2=7)- 循环读取每个元组,
unpack后用逗号分隔输出,和od的格式风格一致
如果需要调整元组结构,只需修改fmt参数即可,比如要新增一个8字节有符号整数,就改成<Bfhl。
方案二:用Shell工具组合(dd+od+paste)
如果不想用Python,也可以通过dd拆分二进制字段,od转换为可读数值,再用paste合并结果:
步骤1:计算元组总数
先确定文件中包含多少个完整元组(每个元组7字节):
total_tuples=$(( $(stat -c %s your_binary_file.bin) / 7 ))
步骤2:分别提取并转换每个字段
- 提取1字节无符号整数:
dd if=your_binary_file.bin bs=7 count=$total_tuples | od -An -tu1 -w1 > col1.txt
- 提取4字节浮点数(跳过前1字节):
dd if=your_binary_file.bin bs=7 count=$total_tuples | dd bs=1 skip=1 count=$((4*total_tuples)) | od -An -tf4 -w4 > col2.txt
- 提取2字节有符号整数(跳过前5字节):
dd if=your_binary_file.bin bs=7 count=$total_tuples | dd bs=1 skip=5 count=$((2*total_tuples)) | od -An -td2 -w2 > col3.txt
步骤3:合并字段为逗号分隔格式
paste -d',' col1.txt col2.txt col3.txt
注意事项:
- 这种方法需要手动计算每个字段的偏移量,结构调整时较为繁琐
od的字节序依赖系统默认设置,如果和文件字节序不符,需要用对应参数调整(比如大端浮点数用od -An -tf4 -w4 -N)
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

