18

バイナリ データを含むファイルがあり、特定の位置にある数バイトを置き換える必要があります。次のようにして、bash をオフセットに向け、必要な場所が見つかったことを示しました。

dd bs=1 if=file iseek=24 conv=block cbs=2 | hexdump

ここで、「ファイル」を出力として使用するには:

echo anInteger | dd bs=1 of=hextest.txt oseek=24 conv=block cbs=2

これは問題なく動作するようです。16 進エディタで行った変更を確認できます。問題は、「anInteger」がその整数のASCII表現として書かれることです(これは理にかなっています)が、バイナリ表現を書く必要があります。

これには bash を使用したいのですが、スクリプトはできるだけ多くのシステムで実行する必要があります (ターゲット システムに python がインストールされているかどうかはわかりません)。

入力をバイナリ (おそらく 16 進数から) に変換するようにコマンドに指示するにはどうすればよいですか?

4

9 に答える 9

16

printfよりも移植性がありechoます。この関数は 10 進数の整数を取り、その値でバイトを出力します。

echobyte () {
    if (( $1 >= 0 && $1 <= 255 ))
    then
        printf "\\x$(printf "%x" $1)"
    else
        printf "Invalid value\n" >&2
        return 1
    fi
}

$ echobyte 97
a
$ for i in {0..15}; do echobyte $i; done | hd
00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
00000010
于 2010-04-30T20:10:55.417 に答える
13

You can use echo to emit specific bytes using hex or octal. For example:

echo -n -e \\x30 

will print ascii 0 (0x30)

(-n remove trailing newline)

于 2010-04-30T18:32:06.553 に答える
8

xxdより良い方法です。xxd -r infile outfileinfile の ascii hex-value を取得して、outfile にパッチを適用します。これにより、infile の特定の位置を指定できます。1FE:55AA

于 2011-11-20T03:06:07.740 に答える
4

これを行う機能があります:

# number representation from 0 to 255 (one char long)
function chr() { printf "\\$(printf '%03o' "$1")" ; return 0 ; }
# from 0 to 65535 (two char long)
function word_litleendian() { chr $(($1 / 256)) ; chr $(($1 % 256)) ; return 0 ; }
function word_bigendian() { chr $(($1 % 256)) ; chr $(($1 / 256)) ; return 0 ; }
# from 0 to 4294967295 (four char long)
function dword_litleendian() { word_lilteendian $(($1 / 65536)) ; word_litleendian $(($1 % 65536)) ; return 0 ; }
function dword_bigendian() { word_bigendian $(($1 / 65536)) ; word_bigendian $(($1 % 65536)) ; return 0 ; }

パイピングまたはリダイレクトを使用して結果を取得できます。

于 2015-07-21T19:23:07.120 に答える
4

御馳走のように働きました。次のコードを使用して、リトル エンディアンのバイト 24 の 4 バイトを 2 つの整数 (1032 と 1920) に置き換えました。コードはファイルを切り捨てません。

echo -e \\x08\\x04\\x80\\x07 | dd of=<file> obs=1 oseek=24 conv=block,notrunc cbs=4

再度、感謝します。

于 2010-04-30T20:16:39.043 に答える
1

bc に頼っても構わないと思っている場合 (これはかなり一般的です)

echo -e "ibase=16\n obase=2 \n A1" | bc -q

役立つかもしれません。

于 2010-04-30T18:29:09.023 に答える
0

必要な入力をファイルに入れ、「if=」オプションを使用して dd を使用すると、必要な入力を正確に挿入できます。

于 2010-04-30T18:29:38.457 に答える