如何在Linux中使用bash创建二进制文件的未修改的十六进制转储?od和hexdump命令都在转储中插入空格,这是不理想的。

有没有一种方法来简单地写一个长字符串与所有十六进制字符,负空格或换行在输出?


当前回答

这似乎取决于od版本的细节。在OSX上,使用这个:

od -t x1 -An file |tr -d '\n '

(这是打印为十六进制字节类型,没有地址。当然,之后还会删除空白。)

其他回答

这段代码产生一个“纯”十六进制转储字符串,它比所有的运行速度更快 其他例子。 它已经在充满二进制零和所有换行的1GB文件上进行了测试。 它不依赖于数据内容,读取1MB记录而不是行。

perl -pe 'BEGIN{$/=\1e6} $_=unpack "H*"'

数十个计时测试表明,对于1GB的文件,下面这些其他方法要慢一些。 所有测试都将输出写入文件,然后通过校验和进行验证。 测试了三个1GB的输入文件:全部字节、全部二进制零和全部lf。

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*",$_'

这似乎取决于od版本的细节。在OSX上,使用这个:

od -t x1 -An file |tr -d '\n '

(这是打印为十六进制字节类型,没有地址。当然,之后还会删除空白。)

tldr;

$ od -t x1 -A n -v <empty.zip | tr -dc '[:xdigit:]' && echo 
504b0506000000000000000000000000000000000000
$

解释:

使用od工具从empty.zip中打印单个十六进制字节(-t x1)——没有地址偏移量(-A n),也没有省略重复的“groups”(-v)——它已被重定向到标准输入。将其传输给tr, tr删除(-d)十六进制字符集的补码(-c) ('[:xdigit:]')。您可以选择打印一个尾随换行符(echo),就像我在这里所做的那样,将输出与下一个shell提示符分开。

引用:

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/od.html https://pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html

xxd -p file

或者如果你想把它都写在一行上:

xxd -p file | tr -d '\n'

其他答案更可取,但对于纯Bash解决方案,我在这里修改了答案中的脚本,以便能够输出表示文件内容的连续十六进制字符流。(它的正常模式是模拟hexdump -C。)