如何在Linux使用Bash创建一个未修改二进制文件的十六进制转储?od
和hexdump
命令都会在转储中插入空格,这并不理想。
是否有一种方法可以简单地写入一个长字符串,其中包含所有十六进制字符,但输出中没有空格或换行符?
xxd -p file
或者如果你想在一行上显示所有内容:
xxd -p file | tr -d '\n'
格式化字符串可以使得十六进制转储的行为完全符合你的需求(没有任何空格,每个字节单独显示):
hexdump -ve '1/1 "%.2x"'
1/1
的意思是“每种格式都应用一次,并占用一个字节”,"%.2x"
是实际的格式字符串,就像在 printf 中一样。在此情况下:2字符十六进制数,如果较短,则前导零。
;echo
使其无法用作bash别名) - mykhalalias to_hex="hexdump -ve '1/1 \"%.2x\"' && echo"
。该命令表示将别名to_hex
绑定到一个操作中,该操作使用hexdump
命令将输入的数据转换为十六进制格式,并使用echo
命令将结果打印到屏幕上。 - devstuffhexdump -ve '"%.2x"'
。 - Alex Chehexdump -n 13 -e '13/1 "%.2x" "\n"'
- Alex Chexdd -p -r < dump > file
将此输出反转回二进制。 - dagelf似乎取决于 od
版本的细节。在OSX上,使用以下命令:
od -t x1 -An file |tr -d '\n '
-v
参数,否则它将跳过带有 *
的重复项。 - Ciro Santilli OurBigBook.comPerl一行命令:
perl -e 'local $/; print unpack "H*", <>' file
你可以使用Python来实现这个目的:
python -c "print(open('file.bin','rb').read().hex())"
...其中file.bin
是您的文件名。
说明:
rb
(读取二进制)模式打开file.bin
。bytes
对象)。bytes
方法.hex()
,它返回没有空格或换行符的十六进制转储。其他答案更为优选,但对于纯Bash解决方案,我修改了这里的答案中的脚本,使其能够输出连续流的十六进制字符,代表文件的内容。(它的普通模式是模拟hexdump -C
。)
$ od -t x1 -A n -v <empty.zip | tr -dc '[:xdigit:]' && echo
504b0506000000000000000000000000000000000000
$
使用od
工具打印单个十六进制字节(-t x1
)---没有地址偏移量(-A n
)和没有省略重复的“组”(-v)
---从已重定向到标准输入的empty.zip
文件中。将其导入tr
,删除(-d
)十六进制字符集('[:xdigit:]'
)的补集(-c
)。您可以选择像我在这里所做的那样打印一个尾随换行符(echo
),以将输出与下一个shell提示分开。
perl -pe 'BEGIN{$/=\1e6} $_=unpack "H*"'
hexdump -ve '1/1 "%.2x"' # ~10x slower
od -v -t x1 -An | tr -d "\n " # ~15x slower
xxd -p | tr -d \\n # ~3x slower
perl -e 'local \$/; print unpack "H*", <>' # ~1.5x slower
- this also slurps the whole file into memory
要反转这个过程:
perl -pe 'BEGIN{$/=\1e6} $_=pack "H*",$_'
我认为这是最受支持的版本(只需要POSIX定义的tr
和od
行为):
cat "$file" | od -v -t x1 -A n | tr -d ' \n'
od
将每个字节作为十六进制打印出来,不带地址,不跳过重复的字节,使用tr
删除输出中所有空格和换行符。请注意,甚至连尾随的换行符都没有被输出。(意图使用cat
是为了允许多核处理,其中cat
可以等待文件系统,而od
仍在处理之前读取的部分。单核用户可能需要将其替换为< "$file" od ...
以减少启动一个额外进程的开销.)cat
并行读取管道缓冲区的输入比在任何时候都与od
一起读取更好。这减少了od
因读取文件而停顿的可能性。 - Mikko Rantalainencat
确实允许并行使用多个CPU核心来执行任务,但实际上,核心之间的交互会导致额外的工作量,因此避免在管道开头使用cat
仍然更快-至少对于本地可访问的文件而言。如果文件位于远程网络驱动器上且连接速度较慢,则在此处使用cat
可以提高性能。话虽如此,od
只能处理约4 MB / s,因此在大多数情况下它将成为瓶颈。 - Mikko Rantalainen