線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1030
推到 Plurk!
推到 Facebook!

Binary File 比對

缺席
akok0111
一般會員


發表:6
回覆:3
積分:1
註冊:2003-12-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-10-12 19:44:20 IP:59.120.xxx.xxx 訂閱
 目前我有兩個binary file,一個為3M,另一個為1M,想要比對3M中的檔案是否包含了這1M的檔案,目前使用了TMemoryStream將兩個檔案讀進來,
我該如何找到1M這個檔案的起始位置在3M這檔案中的位置呢?希望各位先進能指導一下~
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-10-13 00:14:56 IP:122.126.xxx.xxx 訂閱
暴力法比對 :D


[code delphi]
var
m1, m2 : TMemoryStream;
P1 : PAnsiChar;
I : Integer;
begin
m1 := TMemoryStream.Create;
m2 := TMemoryStream.Create;

m1.LoadFromFile('c:\vpn.pdf');
m2.LoadFromFile('c:\vpn2.pdf');
P1 := m1.Memory;
try
for I := 0 to m1.Size -1 do
begin
if CompareMem(P1, m2.Memory, Integer(m2.Size)) then
begin
ShowMessage(Format('m2 in m1, position = %d', [I]));
Exit;
end;
P1 := P1 1;
end;
ShowMessage('m2 not in m1');
finally
m1.Free;
m2.Free;
end;
end;

[/code]

akok0111
一般會員


發表:6
回覆:3
積分:1
註冊:2003-12-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-10-19 15:20:04 IP:59.120.xxx.xxx 訂閱
後來用暴力比對寫出來的程式,不過前提是我已知小檔案在大檔案中的起始位置 

//srcpos : begin from 0.
std::ifstream src(srcfile,std::ios::binary | std::ios::in);
if(!src.is_open()) return false;
std::ifstream sub(subfile,std::ios::binary | std::ios::in);
if(!sub.is_open()) return false;
src.seekg(0,std::ios::end);
long srclength=src.tellg();
src.seekg(0,std::ios::beg);
sub.seekg(0,std::ios::end);
long sublength=sub.tellg();
sub.seekg(0,std::ios::beg);
char srcchar,subchar;
bool allsubexist=false;
for(long i=srcpos;i
{
src.seekg(i,std::ios::beg);
allsubexist=true;
if(srclength-i
{
return false;
}
sub.seekg(0,std::ios::beg);
for(long t=0;t
{
src.get(srcchar);
sub.get(subchar);
if(srcchar!=subchar)
{
allsubexist=false;
break;
}
}
if(allsubexist==true)
{
break;
}
}
return allsubexist;
編輯記錄
akok0111 重新編輯於 2011-10-19 01:21:09, 註解 無‧
系統時間:2017-10-23 14:04:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!