سؤال

أنا أعمل في نظام X_86 64 بت 64 بت.

أنا أقرأ ملف قاعدة البيانات القديمة. يتم تحميله على كتلة الذاكرة واستخدام الإزاحة التي تقرأها للهياكل. هو مكتوب في وضع 32 بت.

لذلك من أجل القراءة بشكل صحيح في وضع 64 بت، أريد إضافة N بايت إلى العنوان الأساسي للهيكل.

منذ مؤشر التحضير

الزيادة لا يساعدني في القيام بذلك كما هو الحال في وضع 64 بت كل مؤشر هو B البايت.

التحيات، دانا.

لقد نشرت بعض الكود هنا. أعتقد أنه صحيح ..

   struct CamNodeTag { 
          CamNodeTag  *nextCam; // next cam
          SInt32 numMake; 
          char  *menuMake; 
    }; 

    long pBaseAddr; // this is long so we an offset bytes from it.

    //Get the size of of the structure in 32 bit environment.//in 64 bit envi it is 20 bytes.
    int CamNodeTagSizeIn32BitMode = 12;


    //Do it in a while loop..
 int i=0;
 CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);

while(pNode !=NULL)
{
    //Do the cam stuff here..

// to get the next node, we add the base addr to the offset


//This will give next cam
 i++;
   pNode = (CamNodeTag *)(pBaseAddr + i*CamNodeTagSizeIn32BitMode);

}
هل كانت مفيدة؟

المحلول

أنا يوصي بدلا من ذلك تقرأ الملف من القرص باستخدام الوظائف التي تكتبها مثل read_uint32_whatever_endian(FILE*) وهذه، وتخزين هذه في ذاكرة 64 بت الجديدة structس.

هذا عزل الرمز الجديد الخاص بك من الخيارات التي يجعل التحويل البرمجي حول تخطيط الذاكرة من هياكلك.

على آلة حديثة، تكون تكلفة أداء هذه التحليلات ضئيلة للغاية لأنني متأكد من أنه لا يمكنك قياسه بالكاد.

في حين أن هناك طفيف حالة الزاوية حيث nmapED ملفات قاعدة البيانات الكبيرة التي تخزن نفس الهيكل الثنائي مثل تمثيل الترجمة في الذاكرة هو زائد، هذه الحالة لا تستحق كثيرا في الممارسة العملية.

توفر فوائد تسلسل مختلفة على القرص في الذاكرة الكثير من الإضافات العملية:

  • إنه محمول - يمكنك تشغيل التعليمات البرمجية الخاصة بك في معالجات مختلفة بأحجام مختلفة من الكلمات والأجراديون المختلفة دون مشاكل
  • يمكنك تمديد الهياكل في أي وقت - يمكنك إنشاء هياكل داخل الذاكرة إلى كائنات مع الأساليب، وحتى أساليب C ++ الظاهرية، وغيرها من فوائد التصميم الموجه للكائنات؛ يمكنك أيضا إضافة أعضاء لا يحصلون على تسلسل، مثل المؤشرات وغيرها من المجالات، ويمكنك دعم إصدارات ملفات قاعدة البيانات الجديدة بسهولة

نصائح أخرى

من أجل النهوض بالمؤشر بشيء آخر غير الحجم الأصلي، عليك أن يلقي إلى Char *.

لقراءة من ملف يستخدم قيم 32 بت ك "مؤشرات" باستخدام معالج 64 بت، يجب عليك إعادة تعريف هياكلك حتى لا تزال الحقول التي كانت مؤشرات 32 بت في الحجم.

typedef int Off32; // our "pointers" need to be 32 bit ints rather than pointers.

struct CamNodeTag { 
   Off32  nextCam; // next cam
   SInt32 numMake; 
   Off32  menuMake; 
}; 

char * pBaseAddr; // this is char * so we an offset bytes from it.

// set this to point to the first node.
CamNodeTag * pNode = (CamNodeTag *)(pBaseAddr + first_node_offset);

// to get the next node, we add the base addr to the offset
// in the structure.

pNode = (CamNodeTag *)(pBaseAddr + pNode->nextCam);

// assuming that the menuMake pointer is also an offset from the base
// use this code to get the actual pointer.
//
char * pMenu = (pBaseAddr + pNode->menuMake);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top