使用xxd查看文件的二进制码
xxd简介
xxd
命令可用于查看文件的二进制或十六进制码,电脑中的文件本质上当然都是以二进制方式保存的,但是我们查看的时候一般以16进制方式查看,因为24=16,每8位二进制(28=256)可表示两位十六进制数(0xFF,F即16,所以16×16=256),即八位二进制和两位十六进制都可表示0-255共256个数(即一个字节)。所以,由于二进制太长,通常都用十六进制来表示二进制数,这样8位可缩短为两位,在查看的时候就方便很多。
以下这段内容copy自man xxd
,为了方便测试,请把它保存为test.txt
文件
xxd creates a hex dump of a given file or standard input. It can also convert a hex dump back to its original binary form. Like uuencode(1) and uude-code(1) it allows the transmission of binary data in a `mail-safe' ASCII representation, but has the advantage of decoding to standard output. Moreover,it can be used to perform binary file patching.
查看文件的十六进制码
直接查看,默认是16进制的
xxd /path/to/test.txt
查看文件的二进制码
加个-b
即可查看文件的二进制码,-b
是binary(二进制)的意思
xxd -b /path/to/test.txt
设置显示字节数
前面我们都是直接查看,没有设置显示长度,那是因为我们的测试文件test.txt非常小,如果大点的文件你直接像前面那样显示,它会一直往终端上输出,一直往上滚动,根本看不了的,所以我们需要指定一个显示长度。
-l
表示length,用于设置每次显示的字节数,-l 0x30
就表示显示0x30个字节(下面有解释)
xdd -l 0x30 /path/to/test.txt
输出如下
00000000: 7878 6420 6372 6561 7465 7320 6120 6865 xxd creates a he
00000010: 7820 6475 6d70 206f 6620 6120 6769 7665 x dump of a give
00000020: 6e20 6669 6c65 206f 7220 7374 616e 6461 n file or standa
注意:
- 0x30是十六进制数(0x开头都是十六进制),0x30转成十进制就是48,所以0x30意思是显示48个字节;
- xxd默认每行显示16个字节:中间8列每列2个字节(因为十六进制数两位就可以显示1个字节),8列共16个字节,第一列和最后一列是辅助显示用的,不是真正的数据;
- 这样的话,因为每行是16个字节,所以48个字节就刚好显示成3行(48/16=3)。
设置每行显示字节数
xxd默认每行显示16个字节,但是使用-c
也可以设置成你想要的其它字节数。-c
意思是column,即“列”的意思,但是这个列是以一个字节(两位十六进制数)为一列的,所以我们看到的“一列”,对-c
来说其实是“两列”,所以其实这个-c
指定的列数,就是字节数。
比如我想一行显示6个字节,那就是-c 6
xxd -c 6 /path/to/test.txt
我们在前面的基础上再指定一下长度,每行显示6个字节(-c 6
),共显示18个字节(-l 18
)
xxd -c 6 -l 18 /path/to/test.txt
输出如下,刚好也是3行(18/6=3)
00000000: 7878 6420 6372 xxd cr
00000006: 6561 7465 7320 eates
0000000c: 6120 6865 7820 a hex
跳过n行
前面设置显示字节数可以限制显示的行数,但那都是从开头开始显示的,能不能从指定位置开始显示呢?肯定是可以的!
-s
表示seek(寻找,即从哪里开始),-s 0x30
表示从0x30
开始寻找(含0x30
那行)
xdd -s 0x30 /path/to/test.txt
我们在前面的基础上再加上显示长度(跳过了前面3行,再显示3行)
xxd -s 0x30 -l 0x30 /path/to/test.txt
输出如下
00000030: 7264 2069 6e70 7574 2e20 4974 2063 616e rd input. It can
00000040: 2061 6c73 6f20 636f 6e76 6572 7420 6120 also convert a
00000050: 6865 7820 6475 6d70 2062 6163 6b20 746f hex dump back to
连续输出十六进制
前面所有的命令,都是每4位隔一个空格,但是如果我不想用空格隔开,我就想完整的把十六进制码输出呢?
使用-ps
选项,可以单纯的连续输出十六进制码,没有空格隔开,也没有第一列的地址和最后一列的文本显示
xxd -ps /path/to/test.txt
输出如下
78786420637265617465732061206865782064756d70206f662061206769
76656e2066696c65206f72207374616e6461726420696e7075742e204974
2063616e20616c736f20636f6e766572742061206865782064756d702062
61636b20746f20697473206f726967696e616c2062696e61727920666f72
6d2e204c696b65207575656e636f646528312920616e6420757564652d63
6f646528312920697420616c6c6f777320746865207472616e736d697373
696f6e206f662062696e617279206461746120696e206120606d61696c2d
736166652720415343494920726570726573656e746174696f6e2c206275
74206861732074686520616476616e74616765206f66206465636f64696e
6720746f207374616e64617264206f75747075742e204d6f72656f766572
2c69742063616e206265207573656420746f20706572666f726d2062696e
6172792066696c65207061746368696e672e0a