Hallo Community,
ich habe ein kleines Problemchen. Ich versuche mir etwas Arbeitsersparnis zu verschaffen und ein fax-log auszuwerten.
Beispiel Dateiausschnitt:
Code:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000520 36 56 3C 41 00 00 00 00 01 00 00 34 00 00 00 00 6V<A.......4....
00000530 00 00 00 00 40 38 02 03 00 00 00 30 00 00 00 00 ....@8.....0....
00000540 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................
00000550 00 00 00 00 00 00 00 00 00 00 00 26 3E 01 00 00 ...........&>...
00000560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000570 00 00 00 00 00 00 00 00 00 01 00 01 30 31 32 33 ............0123
00000580 34 35 36 37 38 00 00 00 00 03 5C 5C 44 45 52 2D 45678.....\\DER-
00000590 53 45 52 56 45 52 5C 54 45 53 54 53 5C 61 72 63 SERVER\TESTS\arc
000005A0 68 69 76 65 5C 75 73 65 72 5C 31 32 33 34 35 36 hive\user\123456
000005B0 37 38 5C 6F 75 74 5C 45 33 37 33 42 45 35 46 00 78\out\E373BE5F.
000005C0 02 2B 34 39 20 31 32 33 34 20 35 36 37 38 39 30 .+49 1234 567890
000005D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000005E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Dabei stellt die "4" am Offset 00000520 ein flag dar, dass für erfolgreich ausgeführt steht. Falls dies der Fall ist, steht wenig später die Telefonnummer (hier +49 1234 567890) - sonst nicht! Ich versuche also diese Datei zu öffnen und die flags zu analysieren. Gleichzeitig muss ich aber bei einem "erfolgreich" (d.h. flag=4) die telefonnummer herauslösen. Irgendwie bekomm ich das aber nicht hin (bin auch nur Delphianfänger!).
Hier mal mein einfacher Code..
- ich suche den code für die "4" -> hex 00 00 34 und merke mir den offset für später (gespeichert wird alles in einem array)
- ich gehe zum offset und suche ab da die nächste telefonnummer, welche immer mit "+", also hex 2B starten sollte. nun müsste ich die nächste nummer irgendwie herauslösen - nur wie??
Delphi-Quellcode:
Procedure TForm1.btn_check_fileClick(Sender: TObject);
Var
FS: TFileStream;
Filename: string;
i,j, offset: Integer;
Result: Array of byte;
fax: Array[0..65000] of string; //maximal 65000 faxe
Begin
j:=0; // Zähler für fax-array
For I := 0 to 65000 do fax[i]:='0';
if OpenDialog1.Execute then
begin
Filename := OpenDialog1.FileName;
end;
if Filename='' then exit;
FS := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
try
SetLength(Result, FS.Size);
lbl_filesize.Caption := 'Dateigröße: '+inttostr(FS.Size)+' Bytes';
FS.Read(Result[0], Length(Result));
/////////////////////// Durchsuchen nach Faxen //////////////////
// Fax gesendet
// Bytefolge suchen nach #000034 -> 4
For I := 0 to FS.Size - 3 do
If (Result[I] = $00) and
(Result[I + 1] = $00) and
(Result[I + 2] = $34) Then
Begin
fax[j]:='1|'+inttostr(I);
j:=j+1;
debug_faxe.Lines.Add('Fax'+Inttostr(j)+' erfolgreich versandt ('+inttostr(I)+')');
End;
//////////// Zugehörige Telefonnummern heraussuchen //////////////////
For I := 0 to 65000 do
begin
// Falls ein | vorkommt und das davor eine 1 ist....
if pos('|', fax[i])<>0 then
if Copy(fax[i],0,pos('|', fax[i])-1)='1' then
begin
//offset - wo er anfangen soll zu suchen
offset:=strtoint(Copy(fax[i],pos('|', fax[i])+1,length(fax[i])));
debug_faxe.Lines.Add('Offset:'+Inttostr(offset));
// Bytefolge suchen nach #2B -> +
For j := offset to FS.Size - 10 do
begin
if (Result[j] = $2B) Then
Begin
debug_faxe.Lines.Add('Telefonnummer:'+inttostr(Result[j+1]);
// keine Ahnung wie weiter.....
End;
end;
end;
end;
finally
FS.Free;
end;
end;
Könnte mir einer von Euch helfen?