السلام عليكم ورحمة الله وبركاته
اخي الكريم اولا شكرا جزيلا على ردك الكريم
لقد وفقني ربي سبحانه وتعالى في تحقيق الشرط والسؤال الدي طرحته سابقا بعد دراسة وتحليل بعض النمادج والامثلة الخاصة بــ TMemoryStream
بحيث قمت بتحديد قيمتين من داتا ملف BIN ثم البحث عن هاتين القيمتين بالقراءة المتتالية للداتا وعند العثور عليها يتم تحويلها لبداية ونهاية للبولك الدي اريد قراءته وكتابته وقد نجحت الفكرة وقمت بتجربتها على عدة ملفات والنتيجة مرضية ارجوا ان تجد فيها جوابا لسؤالك 3 فالقراءة من اول الملف تختلف عن القراءة من أخره والله أعلم
وهدا مثال على ما توصلت له
اخي الكريم اولا شكرا جزيلا على ردك الكريم
لقد وفقني ربي سبحانه وتعالى في تحقيق الشرط والسؤال الدي طرحته سابقا بعد دراسة وتحليل بعض النمادج والامثلة الخاصة بــ TMemoryStream
بحيث قمت بتحديد قيمتين من داتا ملف BIN ثم البحث عن هاتين القيمتين بالقراءة المتتالية للداتا وعند العثور عليها يتم تحويلها لبداية ونهاية للبولك الدي اريد قراءته وكتابته وقد نجحت الفكرة وقمت بتجربتها على عدة ملفات والنتيجة مرضية ارجوا ان تجد فيها جوابا لسؤالك 3 فالقراءة من اول الملف تختلف عن القراءة من أخره والله أعلم
وهدا مثال على ما توصلت له
كود :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
ByteArray = array of Byte;
var
Form1: TForm1;
Buff : AnsiString;
BB : TStringStream;
FileName:String;
F: File;
BinaryBytesRead, TotalBytesRead, i, BufferSize: Integer;
Buffer: array [0..4095] of byte;
StartOffset,EndOffset,Star,EndO: Dword;
implementation
{$R *.dfm}
{------------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Filter:='Binary Files|*.bin';
if opendialog1.Execute then begin
Edit1.Text:= Opendialog1.FileName;
FileName:= Opendialog1.FileName
end;
end;
{------------------------------------------------------------------------------}
procedure TForm1.Button2Click(Sender: TObject);
var
MS1,MSS:TMemoryStream;
begin
TotalBytesRead := 0;
BinaryBytesRead := 0;
Buffer [0] := 0;
FillChar(Buffer,SizeOf(Buffer),0);
if FileExists(FileName) then
begin
AssignFile (F, FileName);
Reset (F,1);
try
repeat
BlockRead (F,Buffer,Sizeof (Buffer),BinaryBytesRead);
inc(TotalBytesRead, BinaryBytesRead);
{ Start Offset Block } { Ãæá 4ÈÇíÊ ãä ÇáÈáæß } {2D726F6D}
for i := 0 to BinaryBytesRead - 4 do
begin
if buffer [i + 0] <> $2D then continue;
if buffer [i + 1] <> $72 then continue;
if buffer [i + 2] <> $6F then continue;
if buffer [i + 3] <> $6D then continue;
StartOffset:= TotalBytesRead - BinaryBytesRead + I;
end;
{ End Offset Block } { ÃÎÑ 4 ÈÇíÊ ãä ÇáÈáæß } {453DCD28}
for i := 0 to BinaryBytesRead -4 do
begin
if buffer [i + 0] <> $45 then continue;
if buffer [i + 1] <> $3D then continue;
if buffer [i + 2] <> $CD then continue;
if buffer [i + 3] <> $28 then continue;
EndOffset:= TotalBytesRead - BinaryBytesRead + I;
end;
until BinaryBytesRead < 4;
finally
CloseFile (F);
{------------------------ Creat and Write Bin File -------------------------}
MS1:= TMemoryStream.Create;
MS1.LoadFromFile(FileName);
Star := StrToInt('$'+IntToHex(StartOffset,8));
EndO := StrToInt('$'+IntToHex(EndOffset,8));
BufferSize := EndOffset - StartOffset ;
SetLength(Buff,BufferSize);
MS1.Position := StartOffset;
MS1.ReadBuffer(Buff[1],BufferSize);
BB := TStringStream.Create(Buff);
MSS:= TMemoryStream.Create;
try
MSS.LoadFromStream(BB);
MSS.writeBuffer(Buff[1],BufferSize);
if MSS.Size>0 then begin
MSS.SaveToFile('.\Find_Block.bin');
label3.Caption:='0x'+IntToHex(StartOffset,8);
label4.Caption:='0x'+IntToHex(EndOffset,8);
end
else
ShowMessage('Error Data Or File incorect');
finally
MS1.Free;
MSS.Free;
end;
end;
end;
end;
end.
لااله الا الله محمد رسول الله


![[-]](https://delphi4arab.net/forum/D4A2020/collapse.png)