如何在Linux中使用bash创建二进制文件的未修改的十六进制转储?od和hexdump命令都在转储中插入空格,这是不理想的。
有没有一种方法来简单地写一个长字符串与所有十六进制字符,负空格或换行在输出?
如何在Linux中使用bash创建二进制文件的未修改的十六进制转储?od和hexdump命令都在转储中插入空格,这是不理想的。
有没有一种方法来简单地写一个长字符串与所有十六进制字符,负空格或换行在输出?
当前回答
xxd -p file
或者如果你想把它都写在一行上:
xxd -p 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
你可以使用Python来实现这个目的:
python -c "print(open('file.bin','rb').read().hex())"
...file.bin是你的文件名。
解释:
以rb(读二进制)模式打开file.bin。 读取内容(作为字节对象返回)。 使用bytes方法.hex(),它返回不带空格或新行的十六进制转储。 打印输出。
我认为这是最广泛支持的版本(只需要POSIX定义的tr和od行为):
cat "$file" | od -v -t x1 -A n | tr -d ' \n'
这使用od将每个字节打印为十六进制,不带地址,不跳过重复的字节,使用tr删除输出中的所有空格和换行符。注意,这里甚至没有触发末尾换行。(cat有意允许多核处理,当od仍在处理之前读取的部分时,cat可以等待文件系统。单核用户可能想用< "$file" od…以节省启动一个额外的进程。)
其他答案更可取,但对于纯Bash解决方案,我在这里修改了答案中的脚本,以便能够输出表示文件内容的连续十六进制字符流。(它的正常模式是模拟hexdump -C。)
格式字符串可以使hexdump的行为完全按照你想要的那样(没有空格,一个字节一个字节):
hexdump -ve '1/1 "%.2x"'
1/1表示“每种格式应用一次并占用一个字节”,而“%。2x"是实际的格式字符串,就像printf一样。在本例中:2个字符的十六进制数,如果较短则前导为零。