od(Octal Dump的缩写)命令主要用于:
od [选项] [文件]
| 选项 | 说明 |
|---|---|
| -A, --address-radix=RADIX | 设置地址显示格式:d(十进制)、o(八进制)、x(十六进制)、n(不显示) |
| -t, --format=TYPE | 设置输出格式类型 |
| -j, --skip-bytes=BYTES | 跳过指定字节数开始显示 |
| -N, --read-bytes=BYTES | 只读取指定字节数 |
| -S, --strings[=BYTES] | 显示至少指定长度的可打印字符串 |
| -v, --output-duplicates | 显示所有行,不省略重复行 |
| -w, --width[=BYTES] | 设置每行输出的字节数 |
| -c | 以ASCII字符显示,控制字符使用C转义符 |
| -b | 以八进制显示单字节 |
| -x | 以十六进制显示双字节(短整型) |
| -d | 以无符号十进制显示双字节 |
| -f | 以浮点数格式显示 |
| -l | 以长整型格式显示 |
| -s | 以有符号十进制显示双字节 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
| 格式字符 | 说明 |
|---|---|
| a | 命名字符 |
| c | ASCII字符或反斜杠转义符 |
| d[尺寸] | 有符号十进制,尺寸可以是1、2、4、8 |
| f[尺寸] | 浮点数,尺寸可以是4、8、12 |
| o[尺寸] | 八进制,尺寸可以是1、2、4、8 |
| u[尺寸] | 无符号十进制,尺寸可以是1、2、4、8 |
| x[尺寸] | 十六进制,尺寸可以是1、2、4、8 |
以默认八进制格式显示文件内容:
od example.txt
以十六进制格式显示文件内容:
od -x example.bin
显示ASCII字符和控制字符:
od -c datafile
同时显示十六进制和ASCII字符:
od -x -c binaryfile
使用 -t 选项自定义输出格式:
# 以十六进制显示单字节
od -t x1 file.bin
# 以八进制显示双字节
od -t o2 file.bin
# 同时显示多种格式
od -t x1 -t c file.bin
跳过文件开头部分或限制读取长度:
# 跳过前100字节
od -j 100 file.bin
# 只读取前50字节
od -N 50 file.bin
# 跳过100字节后读取50字节
od -j 100 -N 50 file.bin
使用 -S 选项显示文件中的可打印字符串:
# 显示至少4个字符的可打印字符串
od -S 4 binaryfile
# 显示所有可打印字符串(默认至少3个字符)
od -S executable
使用 -A 选项设置地址显示格式:
# 以十六进制显示地址
od -A x -t x1 file.bin
# 不显示地址
od -A n -t x1 file.bin
# 以十进制显示地址
od -A d -t x1 file.bin
查看可执行文件或二进制数据的结构:
# 查看ELF文件头
od -N 64 -t x1 -t c /bin/ls
检查文件的魔数以识别文件类型:
# 查看文件开头魔数
od -N 8 -t x1 unknown_file
调试程序生成的数据文件:
# 查看数据文件内容
od -t f4 -t d4 data.bin
查看原始网络数据包内容:
# 以十六进制和ASCII查看数据包
od -x -c packet.dump
查看文本文件中的不可见字符:
# 显示所有字符包括控制字符
od -c textfile.txt
使用od分析特定文件格式:
#!/bin/bash
# 分析PNG文件结构
echo "=== PNG文件分析 ==="
FILE="$1"
if [ ! -f "$FILE" ]; then
echo "文件不存在: $FILE"
exit 1
fi
echo "文件大小: $(stat -c%s "$FILE") 字节"
echo
echo "1. 文件头(8字节):"
od -N 8 -t x1 -t c "$FILE"
echo
echo "2. 第一个数据块(IHDR):"
od -j 8 -N 25 -t x1 -t c "$FILE"
echo
echo "3. 文件尾(IEND):"
od -j -12 -N 12 -t x1 -t c "$FILE"
将二进制数据转换为不同格式:
#!/bin/bash
# 二进制到C数组转换器
convert_to_c_array() {
local file="$1"
local array_name="$2"
echo "const unsigned char ${array_name}[] = {"
od -t x1 -A n -v "$file" | \
sed 's/^/ /' | \
sed 's/ /, 0x/g' | \
sed 's/^,//' | \
sed 's/$/,/' | \
sed 's/^/ 0x/'
echo "};"
echo "const int ${array_name}_size = $(stat -c%s "$file");"
}
# 使用示例
convert_to_c_array "data.bin" "my_data"
比较两个二进制文件的差异:
#!/bin/bash
# 二进制文件比较工具
compare_binary_files() {
local file1="$1"
local file2="$2"
echo "比较文件: $file1 和 $file2"
echo
# 生成两个文件的od输出
local temp1=$(mktemp)
local temp2=$(mktemp)
od -t x1 -A n -v "$file1" > "$temp1"
od -t x1 -A n -v "$file2" > "$temp2"
# 比较差异
diff -u "$temp1" "$temp2"
# 清理
rm -f "$temp1" "$temp2"
}
compare_binary_files "file1.bin" "file2.bin"
| 命令 | 特点 | 适用场景 |
|---|---|---|
| od | 多种格式输出,灵活性强,标准Unix工具 | 二进制分析、文件结构分析、调试 |
| hexdump | 类似od,但输出格式更美观,有Canonical模式 | 十六进制查看、二进制文件浏览 |
| xxd | 十六进制转储,支持反向操作,Vim工具 | 十六进制编辑、二进制补丁 |
| hd | hexdump的别名,通常指向hexdump | 快速十六进制查看 |
# 查看ELF文件头
od -N 52 -t x1 -t c /bin/ls
# 查看PNG文件签名
od -N 8 -t x1 -t c image.png
# 查看ZIP文件头
od -N 30 -t x1 -t c archive.zip
-N 限制长度-v 选项避免重复行被省略