delphi4arab منتديات دلفي للعرب

نسخة كاملة : استفسار حول كود بحث بصيغة hex لقيم
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
الدالة GetHexStrByOffset فيها ثلاث مدخلات
الأول مسار الملف
الثاني أفست البداية
الثالث أفست النهاية
هنا يجب ان لا تكون قيمة أكبر من حجم الملف
اولا شكرا جزيلا لاخي صاحب الموضوع المهم والذي سبق وبحثت جوانبه ولم اجد اجابة شافية وثانيا الشكر كل الشكر لاخونا الكريم الشبح على المعلومات الرائعة وبعد اذن صاحب الموضوع لي بعض التساؤلات بخصوص هذا الطرح
في الحقيقة عندي برنامج يقراء ملف الابروم من احد انواع الهواتف وكنت اضطر الى تحميل هذا الاخير الى برنامج hexedituer ومن ثم ابحث عن قيم معينة داخل الملف وهذه القيم هي شفرة الهاتف ..كل هذا العمل اليدوي اردت ان اختصره من خلال انشاء برنامج احمل له الملف عن طريق opendialog ومن ثم يعطيني القيم المرادة مباشرة ولم اجد حل لان تحميل ملف الى الذاكرة كان بطيئ ومليئ بالاخطاء ....ويبدو لي انك اخي الشبح تمتلك الحل واتمنى ان توضحلي طريقة استخدام هذه الخورزميات وهل تنفع في حالتي هذه مع اجمل التحايا اخي الفاضل
هذه محاولتي لاستثمار الدالة الثانية المثال في المرفقات وممكن اخي الفاضل الشبح هل ممكن طريقة مثالية للتعديل على البيانات وحفضها مجدد

[صورة: D8WE1m.png]

علما اني اضف دالة تحويل الhex الى str وهذا طبعا لاظهار قيم الميمو1 بشكل نص في ميمو2
السلام عليكم
إدا كنت ستعدل في بايتات الملف من Memo
سيتوجب عليك تحويل HexStr إلى Byte Array
هده دالتين واحدة لتحويل HexStr و الأخرى لإعادة الكتابة في الملف من جديد

PHP كود :
type
  TByteArray 
= array of Byte;

procedure HexStr2ByteArray(const HexStr: string; out ByteArray: TByteArray);
var
  
I: Integer;
begin
  SetLength
(ByteArray, Length(HexStr) div 2);
  for 
I := 0 to Pred(Length(HexStr) div 2) do
  
begin
    ByteArray
[I] := StrToInt('$' + Copy(HexStr, (I * 2) + 1, 2));
  
end;
end;

procedure WriteHexStrByOffset(const AOldFile, ANewFile: string; const ABuffer:
  
TByteArray;
  const 
AOffsetB, AOffsetE: Integer);
var
  
MS: TMemoryStream;
begin
  MS 
:= TMemoryStream.Create;
  try
    
MS.LoadFromFile(AOldFile);
    
MS.Position := AOffsetB;
    
//MS.Seek(0, 0);
    
try
      
MS.WriteBuffer(ABuffer[0], AOffsetE + 1);
      
MS.SaveToFile(ANewFile);
    
except
      
// Error
    
end;
  finally
    
MS.Free;
  
end;
end;

{
Usage:

var
  
ByteArray: TByteArray;
begin
  HexStr2ByteArray
('FF00EE', ByteArray);
  
WriteHexStrByOffset('Test.exe', 'NewTest.exe', ByteArray, 0, 3);
end;
} 
أيضا مرفق المثال في المشاركة رقم 6
http://www.delphi4arab.net/forum/showpos...ostcount=6
مع إضافة إمكانية إعادة الكثابة
عيد مبارك اخي الشبح ولجميع الاخوة الكرام سيتم ان شاء الله تطبيق المثال ومحاولة فهم جيد للكود وفي الحقيقة اخي الشبح لقد رفعت الغموض عن هذه المعارف وفتح لنا باب واسع من المعرفة وياريت المزيد من الامثلة او فتح موضوع مستقل تشرح جميع جوانب هذا الموضوع الشيق
الصفحات : 1 2