如何使用bash在Linux中创建二进制文件的未修改十六进制转储? <{1}}和od
命令都在转储中插入空格,这并不理想。
有没有办法简单地写一个长字符串,其中包含输出中的所有十六进制字符,减去空格或换行符?
答案 0 :(得分:230)
xxd -p file
或者如果你想要一条线:
xxd -p file | tr -d '\n'
答案 1 :(得分:79)
格式化字符串可以使hexdump完全按照您的意愿运行(完全没有空格,逐字节):
hexdump -ve '1/1 "%.2x"'
1/1
表示“每个格式应用一次并占用一个字节”,"%.2x"
是实际的格式字符串,就像在printf中一样。在这种情况下:2个字符的十六进制数字,如果更短则前导零。
答案 2 :(得分:22)
似乎取决于od
版本的详细信息。在OSX上,使用:
od -t x1 -An file |tr -d '\n '
(那是打印的类型十六进制字节,没有地址。当然,后来删除了空格。)
答案 3 :(得分:8)
Perl one-liner:
perl -e 'local $/; print unpack "H*", <>' file
答案 4 :(得分:2)
其他答案更可取,但对于纯Bash解决方案,我在my answer here中修改了脚本,以便能够输出表示文件内容的连续十六进制字符流。 (它的正常模式是模仿hexdump -C
。)
答案 5 :(得分:0)
我认为这是得到最广泛支持的版本(仅要求POSIX定义tr
和od
的行为):
cat "$file" | od -v -t x1 -A n | tr -d ' \n'
这使用od
将每个字节打印为不带地址的十六进制,而不会跳过重复的字节,并且使用tr
删除输出中的所有空格和换行符。请注意,此处甚至不会发送尾随换行符。 (cat
旨在允许多核处理,其中cat
可以等待文件系统,而od
仍在处理先前读取的部分。单核用户可能希望将其替换为< "$file" od ...
以保存开始的另一个过程。)
答案 6 :(得分:0)
$ od -t x1 -A n -v <empty.zip | tr -dc '[:xdigit:]' && echo
504b0506000000000000000000000000000000000000
$
使用od
工具来打印单个十六进制字节(-t x1
)-不具有地址偏移量(-A n
),并且不包含重复的“组” (-v)
- -来自empty.zip
,已重定向到标准输入。将其通过管道传输到tr
,后者删除(-d
)十六进制字符集(-c
)的补码('[:xdigit:]'
)。您可以选择打印尾随换行符(echo
),就像我在此处所做的那样,以将输出与下一个shell提示分开。
答案 7 :(得分:0)
这段代码产生一个“纯”的十六进制转储字符串,它运行速度比所有的都快 给出的其他示例。 它已经在填充二进制零和所有换行符的 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*",$_'
答案 8 :(得分:0)
您可以为此目的使用 Python:
python -c "print(open('file.bin','rb').read().hex())"
...其中 file.bin
是您的文件名。
说明:
file.bin
(读取二进制)模式打开 rb
。bytes
对象返回)。bytes
方法 .hex()
,它返回没有空格或换行符的十六进制转储。