myfile
给定一个包含以下内容的文件:
$ cat myfile
foos
文件的十六进制转储为我们提供了内容:
$ hexdump myfile
6f66 736f 000a
目前,我可以通过指定 ascii 格式的内容来创建文件,如下所示:
$ echo foos > myfile
是否可以通过提供准确的十六进制字节而不是 ascii 来创建文件?
$ # How can I make this work?
$ echo --fake-hex-option "6f66 736f 000a" > myfile
$ cat myfile
foos
更新:为了清楚起见,我将问题措辞为询问如何将少量字节写入文件。实际上,我需要一种方法将大量十六进制数字直接通过管道传输到文件中,而不仅仅是 3 个字节:
$ cat hexfile
6f66 736f 6f66 736f ...
$ some_utility hexfile > myfile
$ cat myfile
foosfoosfoosfoos...
答案1
您可以使用echo -e
:
echo -e "\x66\x6f\x6f"
请注意,hexdump -C
您希望按字节顺序转储文件内容,而不是按网络字节顺序解释为 4 字节字。
答案2
这是hexundump
我个人收藏的脚本:
#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
tr/0-9A-Fa-f//cd;
if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
if (length($_) & 1) { s/(.)$//; $c = $1; }
print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }
答案3
模拟字节列车:
echo 41 42 43 44 |
将空格更改为换行符,以便 while/read 可以轻松地将它们解析为 1
tr ' ' '\n' |
逐字节解析
while read hex; do
将十六进制转换为 ascii:
printf \\x$hex
直到输入结束
done
如果要解析的文件非常大,您可能不想使用 bash,因为它很慢。例如 PERL 将是一个更好的选择。
答案4
要将任意十六进制数据写入二进制文件:
echo -n 666f6f | xxd -r -p - file.bin
对于存储在某个文件中的十六进制(输入)数据要写入二进制文件:
xxd -r -p file.hex file.bin
要读取二进制数据:
hd file.bin
或xxd file.bin
仅读取数据(无偏移):
xxd -p file.bin