0

ab.exe と呼ばれるこのファイルがあり、16 進数でこれが含まれています。

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBAAE8CAFDFFFF83C408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054AAE8CAFDFFFF83C40800000000000000000000000000000000000000000000000000000000000000000000000000AAE8CAFDFFFF83C4088D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

16 進数の文字列がファイル内にあるかどうか、およびそれがリスト ボックスに追加されているかどうかを検出すると思われる C++ のコードがあります。

array<Byte>^ target1 = { 0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08,0x8D };
array<Byte>^ target2 = { 0x54,0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08 };
array<Byte>^ target3 = { 0xBB,0xAA,0xE8,0xCA,0xFD,0xFF,0xFF,0x83,0xC4,0x08 };


int matched1 = 0;
int matched2 = 0;
int matched3 = 0;
FileStream^ fs2 = gcnew FileStream(line, FileMode::Open, FileAccess::Read, FileShare::ReadWrite);

int value;
do
{
    value = fs2->ReadByte();
    if (value == target1[matched1]) {
        matched1++;
    }
    else
        matched1 = 0;

    if (value == target2[matched2]) {
        matched2++;
    }
    else
        matched2 = 0;

    if (value == target3[matched3]) {
        matched3++;
    }
    else
        matched3 = 0;

    if(matched1 == target1->Length)
    {
        listBox1->Items->Add(line + "1");

    }

    if(matched2 == target2->Length)
    {
        listBox1->Items->Add(line + "2");

    }

    if(matched3 == target3->Length)
    {
        listBox1->Items->Add(line + "3");

    }
} while (value != -1);

fs2->Close();

問題は、リスト ボックスに行 + 3 のみが追加され、行 + 1 または行 + 2 がリスト ボックスに追加されないことです。

3 つすべての文字列がファイルに含まれているため、リスト ボックスにすべて追加する必要があるため、その理由はわかりません。何らかの理由で、最後の 1 つだけが追加されています。なぜなら、リスト ボックスにすべてが追加されていない理由を教えてください。ありがとう

アップデート1

もう少しいじってみると、毎回追加されるのは最後のターゲットではなく、追加されるのはファイルに表示される最初の文字列です。メッセージボックスを使用してプログラムをステップ実行しましたが、54AAE8CAFDFFFF83C408 がファイルに表示される最初の文字列であり、行 + 2 が追加されますが、何らかの理由で 3 つすべての一致した整数のカウントが停止し、単に = 0ファイルの残りの部分。誰かがそれがなぜなのか、それを修正する方法を私に説明できますか.

Update2

これが問題の答えです。私がする必要があったのは、matched = 0; を追加することだけでした。リストボックスコマンドに追加するたびに。

listBox1->Items->Add(line + "1");
matched1 = 0;

listBox1->Items->Add(line + "2");
matched2 = 0;

listBox1->Items->Add(line + "3");
matched3 = 0;
4

1 に答える 1

0

1 つのパターン (ここでは target3) の最初の一致の後、target3 の最後のバイトを超えて読み取ると (理由によりmatched3++)、これが望ましくない動作を引き起こす可能性があるようです。

アップデート1:

if(matched1 == target1->Length)
{
  matched1 = 0; // pattern matched so reset counter
  ...
}
于 2013-04-20T11:21:23.770 に答える