2013-04-20 53 views
0

我有這個文件稱爲ab.exe它包含這個十六進制C++ CLI從沒有工作文件比較十六進制字節

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BBAAE8CAFDFFFF83C408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054AAE8CAFDFFFF83C40800000000000000000000000000000000000000000000000000000000000000000000000000AAE8CAFDFFFF83C4088D0000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000

我有這個代碼在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字符串在文件中,所以它們都應該被添加到列表框中。出於某種原因,只有最後一個被添加,因爲我嘗試了只有2和第二個被添加。有人告訴我爲什麼他們沒有被添加到列表框。 感謝

UPDATE1

玩了一些它不是被每次添加的最後一個目標後,這是一個看起來被添加在文件中的第一個字符串。我使用消息框介紹了該程序,發生了什麼可以說是54AAE8CAFDFFFF83C408是出現在文件中的第一個字符串,然後會添加第2行,但由於某種原因,所有3的匹配整數停止計數,它們只是= 0文件的其餘部分。有人可以向我解釋爲什麼是這樣以及如何解決它。

UPDATE2

這裏是答案的問題。我需要做的只是添加一個匹配= 0;每次添加到列表框命令後。

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

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

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

回答

0

在我看來,一個模式的第一個匹配後(這裏target3)你看過以後(因爲matched3++)target3的最後一個字節,這可能會導致意外的行爲。

UPDATE1:

if(matched1 == target1->Length) 
{ 
    matched1 = 0; // pattern matched so reset counter 
    ... 
} 
+0

可以請你解釋如何解決它。我也加了一個更新的問題 – patchariadog 2013-04-20 13:21:09

+0

沒關係我想通了 – patchariadog 2013-04-20 13:38:48

+0

看到我的更新:只需重置計數器 – 2013-04-20 13:38:54