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

我不确定这是否是您唯一的问题,但一个问题是:

            if [ $S1==$S2 ]; then

需要是这样的:

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

以便该[命令接收$S1, ==, 和$S2三个单独的参数。

或者,更好的是:

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

(这是等效的,但是当我知道 shell 将是 Bash 时,我总是更喜欢,因为[[它的陷阱要少得多。并且对于精确相等更正确,因为它还提供了一些模式匹配功能,但在这种情况下,真的没关系。)[[[===

于 2013-02-06T23:40:00.127 回答