ファイルに特定のバイトを書き込むには?

ファイルに特定のバイトを書き込むには?

myfile以下の内容を含むファイルが提供されます。

$ cat myfile
foos

ファイルの16進ダンプは次の内容を提供します。

$ hexdump myfile
6f66 736f 000a

現在、次のようにASCII形式でコンテンツを指定してファイルを作成できます。

$ echo foos > myfile

ASCIIの代わりに正確な16進バイトを提供してファイルを生成できますか?

$ # How can I make this work?
$ echo --fake-hex-option "6f66 736f 000a" > myfile
$ cat myfile
foos

更新:わかりやすくするために、ファイルに少数のバイトを書き込む方法を尋ねることで質問を表現しました。実際には、3バイトではなく多数の16進数をファイルに直接パイプする方法が必要です。

$ 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

16進数をASCIIに変換:

  printf \\x$hex

入力が終わるまで

done

解析中のファイルが非常に大きい場合、bashが遅いので使用したくありません。たとえば、PERL はより良い選択になります。

答え4

任意の16進データをバイナリファイルに書き込むには:

echo -n 666f6f | xxd -r -p - file.bin

バイナリファイルに書き込むファイルに保存されている16進数(入力)データの場合:

xxd -r -p file.hex file.bin

バイナリデータを読み取るには:
hd file.binまたはxxd file.bin

データ読み取り専用(オフセットなし):

xxd -p file.bin

関連情報