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