如何将特定字节写入文件?

如何将特定字节写入文件?

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.binxxd file.bin

仅读取数据(无偏移):

xxd -p file.bin

相关内容