linux字节流相关工具
工具角色dd搬运工hexdump眼睛od理科视角cmp判官printf画笔xxd可逆工具strings探针。
·
参考
Linux 底层调试命令
—— dd / hexdump / od / cmp / printf / xxd / strings / tr 等
本文关注的是 “字节级工具”
是 驱动 / FPGA / 嵌入式 / initramfs / 协议调试 的必需品。
一、命令分层
可以把这些命令分为 5 层:
- 数据生成(造数据)
- 数据搬运(I/O)
- 数据观察(dump)
- 数据比较(验证)
- 数据变换(处理)
二、dd —— 原始 I/O 的王者
2.1 dd 是什么?
dd 是一个 按块复制字节流 的工具
2.2 基本语法
dd if=<输入> of=<输出> bs=<块大小> count=<块数>
2.3 常用参数详解
| 参数 | 说明 |
|---|---|
| if | 输入文件或设备 |
| of | 输出文件或设备 |
| bs | 块大小 |
| count | 块数量 |
| skip | 输入跳过块 |
| seek | 输出跳过块 |
| conv=notrunc | 不截断输出文件 |
2.4 用法
生成固定大小文件
dd if=/dev/zero of=1m.bin bs=1M count=1
偏移写(寄存器 / 协议)
printf "\xAA\x55" | dd of=data.bin bs=1 seek=16 conv=notrunc
设备读取
dd if=/dev/pl_data of=out.bin bs=4K count=1
性能测试
time dd if=/dev/pl_data of=/dev/null bs=64K count=1024
三、hexdump —— 二进制可视化
3.1 hexdump 是干啥的?
把不可读的二进制,变成人类可理解的形式
3.2 最常用模式
hexdump -C file.bin
# 前3行
hexdump -C test_drv.o | head -n 3
# 后3行
hexdump -C test_drv.o | tail-n 3
# 字符串筛选
hexdump -C test_drv.c | grep "H"
# 字符串筛选或略大小写
hexdump -C data.bin | grep -i "a55"
# 二进制筛选
$: printf "\x01\x02\x03\x04" > raw.bin
$: grep -oba $'\x01\x02' raw.bin
输出结构:
- 偏移
- 十六进制
- ASCII
3.3 精确控制输出格式(高级)
hexdump -v -e '4/4 "%11u "' -e '"\n"' /dev/pl_data
#解释:
# 4/4:一次读 4 个 4 字节
# %11u:无符号整数
# -e '"\n"':每行换行
3.4 hexdump 是否阻塞?
- 对普通文件:不阻塞
- 对字符设备:取决于驱动 read()
- 对管道:等待数据
四、od —— hexdump 的“理科生版本”
4.1 od 是什么?
od = octal dump
一个更“数学化”的二进制查看工具
4.2 常用参数
od -Ax -tx1 file.bin
| 参数 | 含义 |
|---|---|
| -Ax | 偏移用十六进制 |
| -tx1 | 单字节十六进制 |
| -td4 | 4 字节十进制 |
| -tf | 浮点数 |
4.3 od vs hexdump
| 项目 | hexdump | od |
|---|---|---|
| 可读性 | 高 | 中 |
| 格式灵活性 | 中 | 高 |
| 工程习惯 | 新 | 老 UNIX |
4.4 适合场景
- FPGA 输出寄存器
- ADC 原始数据
- 浮点格式检查
五、cmp —— 二进制对比神器
5.1 cmp 是什么?
cmp 用来 比较两个文件的字节是否完全一致
5.2 基本用法
cmp a.bin b.bin
- 无输出:完全相同
- 有输出:报告第一个不同字节
5.3 静默模式(脚本必备)
cmp -s a.bin b.bin
echo $? # 0 相同,1 不同
5.4 工程级用途
- DMA 前后数据校验
- Flash 写入校验
- 回环验证
5.5 cmp vs diff
| 项目 | cmp | diff |
|---|---|---|
| 对象 | 二进制 | 文本 |
| 输出 | 简洁 | 详细 |
| 是否结构化 | 否 | 是 |
六、xxd —— hexdump + 反编译能力
6.1 xxd 是什么?
xxd 不仅能 dump,还能 反向生成二进制
6.2 基本用法
xxd file.bin
6.3 反向生成(二进制“反汇编”)
xxd dump.txt > dump.hex
xxd -r dump.hex > file.bin
👉 hexdump / od 做不到
七、printf —— shell 中的“二进制画笔”
7.1 printf 能干啥?
- 格式化文本
- 输出精确字节
- 构造协议帧
7.2 输出原始字节
printf "\x01\x02\x03\x04" > raw.bin
7.3 和 dd 联用
printf "\xDE\xAD\xBE\xEF" | dd of=mem.bin bs=1 seek=128 conv=notrunc
八、strings —— 从二进制中“捞文本”
8.1 strings 是什么?
提取二进制中的可打印字符串
8.2 用途
strings firmware.bin
strings vmlinux
8.3 工程场景
- 固件分析
- 版本号确认
- Debug 信息确认
九、tr —— 字节级替换工具
9.1 tr 是什么?
tr 用来 逐字节映射 / 删除
9.2 示例
删除所有 0x00:
tr -d '\000' < data.bin
9.3 简单编码处理
tr a-z A-Z < file.txt
十、stat / wc / cat -A
10.1 stat
查看 inode / block / 时间戳
stat file.bin
10.2 wc
wc -c file.bin # 字节数
10.3 cat -A
显示不可见字符
cat -A file.txt
十一、组合使用
11.1 DMA 验证流程
printf "\x01\x02\x03\x04" > in.bin
dd if=in.bin of=/dev/pl_dma
dd if=/dev/pl_dma of=out.bin
cmp in.bin out.bin
11.2 寄存器观察
watch -n 1 "od -Ax -tx4 /dev/pl_reg"
十二、grep —— 文本搜索利器
12.1 grep 是什么?
grep用来 在文件或输入流中查找匹配模式的行
对驱动、FPGA、嵌入式日志非常有用,快速定位调试信息。
12.2 基本用法
grep "字符串" file.txt
| 选项 | 说明 |
|---|---|
| -r / -R | 递归搜索目录 |
| -i | 忽略大小写 |
| -n | 显示行号 |
| -l | 只显示文件名 |
| –color=auto | 高亮匹配内容 |
| -v | 显示不匹配的行 |
| -o | 只输出匹配内容 |
# 在当前目录及子目录搜索 dev_info
grep -rin --color=auto "dev_info" .
# 查找 hexdump 输出中包含 a55 的行
hexdump -C data.bin | grep -i "a55"
# 找出所有 C 文件中包含某函数的文件名
grep -rl "my_function" *.c
# 递归搜索哪个文件含有hello
grep -r "hello" .
十三、sed —— 流式文本处理器
13.1 sed 是什么?
sed = stream editor,能在文本流中查找、替换、删除、插入
对日志处理、文件批量修改、协议模拟很有用。
13.2 基本语法
sed [选项] ‘命令’ 文件
- s/pattern/replace/ → 替换
- d → 删除行
- p → 打印匹配行
- 支持正则表达式
示例:
替换文件中所有 foo 为 bar(输出到终端,不修改原文件)
sed 's/foo/bar/g' file.txt
删除包含 debug 的行
sed '/debug/d' logfile.txt
只打印包含 init 的行
sed -n '/init/p' file.txt
使用管道处理
dmesg | sed -n '/error/p'
高级用法
- 多行处理:
sed -n '1,10p' file.txt # 打印前 10 行
- 原地修改文件:
sed -i 's/foo/bar/g' file.txt
- 与 grep 配合:
hexdump -C data.bin | grep "01 02" | sed 's/ /-/g'
十四、总结
| 工具 | 角色 |
|---|---|
| dd | 搬运工 |
| hexdump | 眼睛 |
| od | 理科视角 |
| cmp | 判官 |
| printf | 画笔 |
| xxd | 可逆工具 |
| strings | 探针 |
| grep | 筛子 / 定位器 |
| sed | 改造工 / 流式编辑器 |
更多推荐


所有评论(0)