كتابة هيكل طول متغير C # إلى ثنائي وقراءةه في C ++؟

StackOverflow https://stackoverflow.com/questions/1449125

  •  11-09-2019
  •  | 
  •  

سؤال

حسنا، لذلك أنا مواصلة العمل على محرك ألعابي الصغير لتعليم لي C # / C ++ المزيد. الآن أحاول كتابة طريقة لتخزين البيانات بتنسيق ثنائي، قمت بإنشائها. (هذا يتعلم، أريد أن أفعل هذا بنفسي من الصفر). ما أتساءل ما أتساءل ما هي أفضل طريقة للتعامل مع صفائف طول المتغير داخل هيكل عند قراءة ذلك في C ++؟

على سبيل المثال هنا هو ما لدي حاليا لهيكلتي:

 [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryHeader
    {
        public Int32 m_CheckSumLength;
        public byte[] m_Checksum;
        public Int32 m_NumberOfRecords;
        public FooBinaryRecordHeader[] m_BinaryRecordHeaders;
        public FooBinaryRecord[] m_BinaryRecords;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecordHeader
    {
        public Int32 m_FileNameLength;
        public char[] m_FileName;
        public Int64 m_Offset;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct FooBinaryRecord
    {
        public bool m_IsEncrypted;
        public Int64 m_DataSize;
        public byte[] m_Data;
    }

الآن كيف أذهب في C ++ لقراءة هذا بالفعل في هيكل في C ++؟ كنت على أمل أن أتجول إلى قراءة كل عنصر من العناصر واحدا تلو الآخر ونسخها في هيكل.

البرنامج التعليمي الحقيقي الوحيد الذي وجدته في هذا هو هذا: http://www.gamedev.net/community/forums/topic.asp؟topic_id=31040&whichpage=1�.

سآخذ تخمين برية وأقول قراءة هذا في هيكل C ++ غير ممكن حقا؟

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

المحلول

يمكنك قراءتها من تعيين تنسيق ثنائي نسخة من هذه الهياكل. يجب التعامل مع كل مجموعة بمثابة مؤشر ويجب أن يكون لديك عدد صحيح بحجم هذه الصفيف.

على سبيل المثال في

ج #

 blustlayout (layoutkind.Seconational)] بنية عامة {public int32 m_checksumlengthlength؛ البايت العام [] m_checksum؛ }

C ++.

 بنية A {int طول شار * ناقل}

ملاحظات: البايت لديه نفس حجم char.

عندما تقرأ من ثنائي، يمكنك قراءة أول 4 بايت (INT INT هو 32 من AKA 4 BYTE) وتخصيص 4 + (طول القراءة) بعد ذلك يمكنك القراءة مباشرة إلى المخزن المؤقت المخصص وتعامل كهيكل.


    		

نصائح أخرى

لا يوجد شيء مثل صفيف طول متغير في هيكل.

لنفترض أن لدي هيكل point مثل

struct point
{
    int x;
    int y;
}

إذا أردت مجموعة من 5 من هذه، فإن المترجم سيحتفظ في الأساس بمساحة لمدة 10 دولارات. ماذا يحدث إذا طلبت مجموعة من الهياكل، منها كل منها يحتوي على صفيف طول متغير؟ لا توجد طريقة لمحاذاة تلك الموجودة في الذاكرة لأننا لا نستطيع معرفة مقدار المساحة للحجز لكل واحد.

ما أنت يمكن القيام به هو إعلان مؤشر إلى نوع ما تريد صفيف طول متغير، لأن المؤشر هو حجم ثابت. بعد ذلك، تخصيص ذاكرة كافية لمعرفة العديد من مثيلات هذا النوع، وأشر إليها بهذه الطريقة. ربما تحتاج إلى إضافة أيضا length الحقل إلى الهيكل حتى تعرف بالضبط إلى أي مدى يمكنك الذهاب إلى الماضي للمؤشر قبل أن تخاطر Segfaulting.

قد تحصل على شعر قليلا ذهابا وإيابا بين التعليمات البرمجية المدارة وغير المدارة وتخصيص الذاكرة وتحريرها، ولكن هذا تمرين جيد آخر لتعلم C ++ و C # معا، إذا كان أي شيء.

استخدم Marshall.SulttOptr وطول نسخة من الهيكل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top