Ich hab nun mal folgende Idee gehabt:
Ich lese einen Block von 256 Zeichen aus. Ist die gesuchte Zeichenkette drin -> bingo, wenn nicht, gehe ich mit FileSeek die Anzahl von Zeichen zurück, die der längsten Zeichenkette entsprechen, die ich suche. Damit sollte ich den Fall kompensieren können, der auftritt, wenn die ZK grade nur zum Teil im ausgelesenen Puffer liegt. Das ganze bis zum Dateiende.
Theoretisch sollte das doch gehen, oder?
Dummerweise funktioniert es nicht, warum auch immer, hier mal mein Code dazu:
Delphi-Quellcode:
function TForm2.HexcodeInFile(HexCodeList: array of string): boolean;
var
bufferBig: array [0..255] of char;
sHexBigBuffer,
sTmpBuffer: string;
iHexListCounter,
iFileSeekResult,
iFileReadResult,
iMaxHexCode,
i: integer;
begin
Result := false;
Label4.Caption := '';
iMaxHexCode := 0;
for i := 0 to Length(HexCodeList) - 1 do
begin
if Length(HexCodeList[i]) > iMaxHexCode then
iMaxHexCode := Length(HexCodeList[i]);
end;
iFileSeekResult := FileSeek(hFileHandle,0,0);
while not iFileSeekResult < 0 do
begin
iFileReadResult := FileRead(hFileHandle,bufferBig,256);
sHexBigBuffer := ParseHex(bufferBig);
for iHexListCounter := 0 to Length(HexCodeList) - 1 do
begin
sTmpBuffer := HexCodeList[iHexListCounter];
if not (StrPos(PChar(sHexBigBuffer),PChar(sTmpBuffer)) = nil) then
begin
Result := true;
Exit;
end;
end;
if iFileReadResult < 256 then
Exit;
iFileSeekResult := FileSeek(hFileHandle,-iMaxHexCode-1,1);
Label4.Caption := IntToStr(iFileSeekResult);
Application.ProcessMessages;
end;
end;
ParseHex ist eine Funktion, die mit Zeichen für Zeichen eines Strings in den entsprechenden HexCode verwandelt. Die Labels sind nur für mich zur Anzeige gedacht, die Datei wird vor dem Funktionsaufruf mit FileOpen geöffnet und dannach wieder per FileClose geschlossen, hFileHandle ist dazu das entsprechende
Handle auf die Datei.
Ich gebe nun also eine Datei hinein, von der ich ganz genau weiß, dass diese das gesuchte enthält. Allerdings erhalte ich immer ein Result false zurück.
Ich frage mich nun, warum nur?