次の内容のファイル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...
これは私の個人的なコレクションの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"; }
echo -e
を使用できます。
echo -e "\x66\x6f\x6f"
hexdump -C
は、ネットワークバイトオーダーの4バイトワードとして解釈されるのではなく、バイトオーダーでファイルの内容をダンプするものです。
バイト列をシミュレートします。
echo 41 42 43 44 |
スペースを改行に変更して、while/readがスペースを1つずつ簡単に解析できるようにする
tr ' ' '\n' |
バイトごとに解析
while read hex; do
16進数をASCIIに変換します。
printf \\x$hex
入力が終わるまで
done
解析するファイルが非常に大きい場合は、遅いため、おそらくbashを使用したくないでしょう。たとえば、Perlの方が適しています。
あなたが見つけている* some_utility *は dd
( manual )です。 bs
(ブロックサイズ)、count
、およびskip
オプションを指定することにより、ファイルの有効な位置から別のファイルに有効なバイトをコピーできます。
例
ファイルの最初の1024バイトを別のファイルにコピーします。
$ dd if=liveusb-creator-3.11.7-setup.exe of=test.ex_ bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.03922 s, 26.1 kB/s
dc
からP
rintにバイトの(UCHAR_MAX+1)
値を使用する方法の例を次に示します。
printf %dP 104 101 121 32 116 104 101 114 101 10 |dc
...印刷する...
hey there
デフォルトのi
nput基数は10-10進数ですが、$val i
を使用して設定できます。ここで、$val
は2〜16の任意の数値です(現在の入力基数が10ではない場合、現在のベースの値を使用して10に戻す必要があります。それ以外の場合は、常にAi
)を実行できます。
次に、より複雑な例を示します。
LC_ALL=C man man 2>/dev/null |
od -v -An -t x1 |
tr -s '[:space:]' P | {
echo 16i0
tr '[:lower:]' '[:upper:]'
} | dc | head
...man man
の出力を16進数に変換し、再びストリームに戻して出力します。
MAN(1) Manual pager utils MAN(1)
NAME
man - an interface to the on-line reference manuals
SYNOPSIS
man [-C file] [-d] [-D] [--warnings[=warnings]] [-R
encoding] [-L locale] [-m system[,...]] [-M path]
アルファベットの[:hexdigit:]
sがすべて大文字であることを確認し、P
をすべてのペアの間に挟み、dc
にパイプします。