web-dev-qa-db-ja.com

ファイルに特定のバイトをどのように書き込みますか?

次の内容のファイル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...
6
Cory Klein

これは私の個人的なコレクションの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バイトワードとして解釈されるのではなく、バイトオーダーでファイルの内容をダンプするものです。

6

バイト列をシミュレートします。

echo 41 42 43 44 | 

スペースを改行に変更して、while/readがスペースを1つずつ簡単に解析できるようにする

tr ' ' '\n' | 

バイトごとに解析

while read hex; do

16進数をASCIIに変換します。

  printf \\x$hex

入力が終わるまで

done

解析するファイルが非常に大きい場合は、遅いため、おそらくbashを使用したくないでしょう。たとえば、Perlの方が適しています。

3
jippie

あなたが見つけている* some_utility *は ddmanual )です。 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
2
LiuYan 刘研

dcからPrintにバイトの(UCHAR_MAX+1)値を使用する方法の例を次に示します。

printf %dP 104 101 121 32 116 104 101 114 101 10 |dc

...印刷する...

hey there

デフォルトのinput基数は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にパイプします。

1
mikeserv