多进制数据查看工具-hexdump
2012-12-10 11:02:54 阿炯

hexdump 是一个十六进制数据查看工具,可生成 CP/M-like 格式的数据,可处理 EBCDIC,支持国际化,提供很多格式化的函数。

Dump binary files in a CP/M-like hex format. Yes, it's yet another textual hex dumper for people who think od -x output is ugly. This one produces a nice CP/M-like format by default and can do EBCDIC. It's internationalized, too. Has many optional formatting functions.


hexdumpASCII、十进制、十六进制或八进制显示文件内容。xxd也是类似的多进制数据查看工具。

格式
hexdump [options] FILE [...]
hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]

选项说明
-b        单字节八进制显示。每个字节显示为8进制。一行共16个字节,一行开始以十六进制显示偏移值。
-c        单字节字符显示。每个字节显示为ASCII字符。
-C    规范化“十六进制+ASCII”显示。每个字节显示为16进制和相应的ASCII字符。
-d        两字节十进制显示。
-e <format_string>    以指定的格式字符串展示数据。
-f <format_file>    指定包含一个或多个换行分隔格式字符串的文件。内容使用 # 号开头表示注释。
-n <length>    只解释输入的指定<length>长度个字节。
-o        两字节八进制显示。
-s <offset>        跳过开头指定长度个字节。从偏移量开始输出。
-v        显示时不压缩相似的行。该选项使 hextump 显示所有输入数据。没有该选项的话,任何数量的输出行组如果与前一组相同,将被替换为由一个星号构成的行。
-x        两字节十六进制显示。


格式(-e参数)

格式字符串由单引号包含,格式字符串形如:'a/b "format1" "format2"'。每个格式字符串由三部分组成,每个由空格分割,如a/b表示,b表示对每b个输入字节应用format1格式,a表示对每个a输入字节应用format2,一般a>b,且b只能为1,2,4,另外a可以省略,若省略则a=1。format1和format2中可以使用类似printf的格式字符串。
%02d:两位十进制
%03x:三位十六进制
%02o:两位八进制
%c:单个字符等
%_ad:标记下一个输出字节的序号,用十进制表示
%_ax:标记下一个输出字节的序号,用十六进制表示
%_ao:标记下一个输出字节的序号,用八进制表示
%_p:对不能以常规字符显示的用.代替

同一行显示多个格式字符串,可以跟多个-e选项。


格式字符串

格式字符串可以包含任意数量的格式单元,由空格分隔。格式单元最多包含三项:迭代计数、字节计数和格式。

迭代计数是可选的正整数,缺省为1,表示每种格式应用的次数。

字节计数是可选的正整数,表示每次按照指定格式迭代要解释的字节数。

如果指定了迭代计数和/或字节计数,则必须使用单斜杠放在迭代计数之后和/或字节计数之前消除歧义。斜杠前后的任何空格都将被忽略。

格式是必需的,必须用双引号括起来。它被解释为 fprintf 样式的格式字符串(参见 fprintf(3)),但以下情况除外:
星号(*)不能用作字段宽度或精度。
每个 s 转换字符都需要字节计数或字段精度(不同于 fprintf(3) 默认值,如果精度未指定,则打印整个字符串)。
不支持转换字符 h、l、n、p 和 q。
支持 C 标准中描述的单字符转义序列。

字符    转义
NULL    \0
<alert character>        \a
<backspace>        \b
<form-feed>        \f
<newline>        \n
<carriage return>        \r
<tab>    \t
<vertical tab>        \v


转换字符串

hexdump 还支持以下额外的转换字符串用于格式字符串中。

_a[dox]    标记下一个输出字节的偏移量,在输入文件中累积。d、o、x 分别以十进制、八进制和十六进制显示。
_A[dox]    与 _a 转换字符串相同,只是在处理所有输入数据后只执行一次。
_c    在默认字符集中输出字符。非打印字符以三个字符、零填充八进制显示,但可通过标准转义符号(见上文)表示的字符除外。
_p    默认字符集中输出字符。非打印字符显示为单个点号 “.”。
_u    输出美国 ASCII 字符,控制字符使用以下小写名称显示除外。大于 0xff 的字符显示为十六进制字符串。

控制字符如下:

码值

名称

全称

0x00

nul

null

0x01

soh

start of headline

0x02

stx

start of text

0x03

etx

end of text

0x04

eot

end of transmission

0x05

enq

enquiry

0x06

ack

acknowledge

0x07

bel

bell

0x08

bs

backspace

0x09

ht

horizontal

0x0A

lf

line feed

0x0B

vt

vertical tab

0x0C

ff

form feed

0x0D

cr

carriage return

0x0E

so

shift out

0x0F

si

shift in

0x10

dle

data link escape

0x11

dc1

device control 1

0x12

dc2

device control 2

0x13

dc3

device control 3

0x14

dc4

device control 3

0x15

nak

negative acknowledgement

0x16

syn

synchronous idle

0x17

etb

end of transmission block

0x18

can

cancel

0x19

em

end of medium

0x1A

sub

substitute

0x1b

esc

escape

0x1C

fs

file separator

0x1D

gs

group separator

0x1E

rs

record separator

0x1F

us

unit separator

0x7F

del

delete



示例

使用vim在文件t2.txt中输入如下内容:
FreeOA.Net

不指定选项缺省以十六进制显示指定文件的内容。
$ hexdump t2.txt
0000000 7246 6565 414f 4e2e 7465 000a          
000000b

其中第一列为偏移量。

单字节字符展示。
0000000   F   r   e   e   O   A   .   N   e   t  \n
000000b

输出十六进制和对应字符。
00000000  46 72 65 65 4f 41 2e 4e  65 74 0a                 |FreeOA.Net.|
0000000b

从指定偏移量开始输出。比如偏移3个字节,跳过'Fre'。
hexdump -s3 -C t2.txt
00000003  65 4f 41 2e 4e 65 74 0a                           |eOA.Net.|

格式化输出并标记每个字节的偏移量。
hexdump -e'/1 "%_ad %02X\n"' t2.txt
0 46
1 72
2 65
*
4 4F
5 41
6 2E
7 4E
8 65
9 74
10 0A


hexdump与od

在Linux中,两命令都用于以十六进制和其他格式显示文件的内容,都提供了对文件进行二进制查看和分析的功能。以下是其简要说明:

od命令:
“od”(octal dump)命令以不同的格式显示文件的内容,默认以八进制格式显示。它可以显示文件的十六进制值、八进制值、ASCII字符或其他格式的数据。
常用选项包括:
“-t”:指定要显示的数据格式,如"-t x"表示十六进制格式,"-t d"表示十进制格式。
“-A”:指定要显示的字符集,如"-A n"表示使用无符号字符(不显示不可打印字符)。
“-c”:以ASCII字符形式显示文件内容。
示例:
显示文件的十六进制格式:od -t x1 file.txt
显示文件的ASCII字符格式:od -c file.txt

hexdump命令:
"hexdump"命令以十六进制和ASCII字符形式显示文件的内容。它以列格式显示文件的十六进制值,并在相邻的列中显示相应的ASCII字符。
常用选项包括:
“-C”:以列格式显示十六进制和ASCII字符。
“-n”:指定要显示的字节数。
“-s”:指定要从文件中开始显示的偏移量。
示例:见上文。

这些命令可以帮助以不同的格式查看文件的内容,特别适用于对二进制文件、内存映像或其他非文本文件进行分析和调试。在功能和用法上有一些区别,尽管它们都用于以十六进制和其他格式显示文件的内容。以下是它们之间的主要区别:

输出格式:"od"命令默认以八进制格式显示文件内容,但可以通过选项来选择其他格式,如十六进制或十进制。它可以显示文件的十六进制值、八进制值、ASCII字符或其他格式的数据。而"hexdump"命令以十六进制和ASCII字符形式显示文件内容,并以列格式呈现,将相邻的十六进制值和ASCII字符显示在一起。

默认显示:"od"命令默认情况下显示文件的所有字节,包括不可打印字符。它显示文件的每个字节的八进制值,并且可以通过选项来选择不同的显示格式。而"hexdump"命令默认只显示可打印字符的十六进制值和ASCII字符,不显示不可打印字符。

可读性:"hexdump"命令以列格式显示文件内容,将十六进制值和ASCII字符一一对应显示,更易于人类阅读和分析。它提供了一种更直观的方式来查看文件的内容。相比之下,"od"命令以行格式显示文件内容,可能不太直观,需要更多的解析和解读。

选项和功能:"od"命令提供了更多的选项来自定义输出格式和显示内容,例如选择不同的数据格式、指定字符集和显示地址等。它还可以处理更广泛的数据类型,并具有更多的功能,如显示文件的文件偏移量和文件指针位置。而"hexdump"命令提供了一些简单的选项,如指定显示格式、显示字节数等,但功能相对较简单。


最新版本:1.8
使用C99 bools,通过了cppcheck审计,并添加一个回归分析测试。

项目主页:http://www.catb.org/~esr/hexdump/