0

バイナリ ファイルがあり、ファイル内のビットのブロブを (何らかのパターンで) 比較し、それらを同じサイズの新しいビットのブロブに置き換える必要があります。

それを行うための最良の方法は何だろうか?

#$1 and $2 are two different binary files.

    function compareByteByByte()
    {
        counter=0
        while [ $counter -le $(( $PNG_FILE_SIZE-1 )) ]
        do

            S1=$($READFILE_EXE -t x1 --read-bytes=1 --skip-bytes=0 $1 | head -1 | awk '{print $2}')
            S2=$($READFILE_EXE -t x1 --read-bytes=1 --skip-bytes=$counter $2 | head -1 | awk '{print $2}')
            if [ $S1==$S2 ]; then
                counter=$(( $counter + 1 ))
                echo "Offset#$counter: $S2"
            else
                echo "S1('$S1') is equal to S2('$S2')"
                break
            fi  
        done
    }

S1 と S2 が等しい場合、ループを中断したいと思いますが、明らかに中断されません。ここで何か不足していますか? 私はスクリプトの世界の初心者なので、ご容赦ください

4

2 に答える 2

0

これをbashで試して、バイナリファイルと比較できます

diff <(xxd b1) <(xxd b2)

またはこれ:

vimdiff <(xxd b1) <(xxd b2)

より強力なツールを探している場合は、DHEX、VBinDiff、JDIFF を試してください。

この投稿も参照してください。

于 2013-02-06T00:26:46.810 に答える
0

これがあなたの唯一の問題かどうかはわかりませんが、1 つの問題は次のことです。

            if [ $S1==$S2 ]; then

これである必要があります:

            if [ "$S1" == "$S2" ]; then

コマンドが 、、およびを正確に 3 つの個別の引数として[受け取るようにします。$S1==$S2

または、さらに良いこと:

            if [[ "$S1" = "$S2" ]]; then

(これは同等ですが、問題がはるかに少ないため、シェルがBashになることがわかっている場合は常に優先[[します。また、少しのパターンマッチング機能も提供するため、正確な同等性の方がより正確ですが、この場合は特に関係ありませ。)[[[===

于 2013-02-06T23:40:00.127 に答える