如何在Linux中使用bash创建二进制文件的未修改的十六进制转储?od和hexdump命令都在转储中插入空格,这是不理想的。
有没有一种方法来简单地写一个长字符串与所有十六进制字符,负空格或换行在输出?
如何在Linux中使用bash创建二进制文件的未修改的十六进制转储?od和hexdump命令都在转储中插入空格,这是不理想的。
有没有一种方法来简单地写一个长字符串与所有十六进制字符,负空格或换行在输出?
当前回答
这似乎取决于od版本的细节。在OSX上,使用这个:
od -t x1 -An file |tr -d '\n '
(这是打印为十六进制字节类型,没有地址。当然,之后还会删除空白。)
其他回答
这似乎取决于od版本的细节。在OSX上,使用这个:
od -t x1 -An file |tr -d '\n '
(这是打印为十六进制字节类型,没有地址。当然,之后还会删除空白。)
Perl一行程序:
perl -e 'local $/; print unpack "H*", <>' file
这段代码产生一个“纯”十六进制转储字符串,它比所有的运行速度更快 其他例子。 它已经在充满二进制零和所有换行的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*",$_'
格式字符串可以使hexdump的行为完全按照你想要的那样(没有空格,一个字节一个字节):
hexdump -ve '1/1 "%.2x"'
1/1表示“每种格式应用一次并占用一个字节”,而“%。2x"是实际的格式字符串,就像printf一样。在本例中:2个字符的十六进制数,如果较短则前导为零。
你可以使用Python来实现这个目的:
python -c "print(open('file.bin','rb').read().hex())"
...file.bin是你的文件名。
解释:
以rb(读二进制)模式打开file.bin。 读取内容(作为字节对象返回)。 使用bytes方法.hex(),它返回不带空格或新行的十六进制转储。 打印输出。