如何在bash中创建仅包含空格的十六进制字符的文件的十六进制转储?

时间:2010-04-10 20:01:50

标签: linux bash hex

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

有没有办法简单地写一个长字符串,其中包含输出中的所有十六进制字符,减去空格或换行符?

9 个答案:

答案 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定义trod的行为):

cat "$file" | od -v -t x1 -A n | tr -d ' \n'

这使用od将每个字节打印为不带地址的十六进制,而不会跳过重复的字节,并且使用tr删除输出中的所有空格和换行符。请注意,此处甚至不会发送尾随换行符。 (cat旨在允许多核处理,其中cat可以等待文件系统,而od仍在处理先前读取的部分。单核用户可能希望将其替换为< "$file" od ...以保存开始的另一个过程。)

答案 6 :(得分:0)

tldr;

$ 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 是您的文件名。

说明:

  1. file.bin(读取二进制)模式打开 rb
  2. 读取内容(作为 bytes 对象返回)。
  3. 使用 bytes 方法 .hex(),它返回没有空格或换行符的十六进制转储。
  4. 打印输出。