سؤال

أنا أستخدم Protobuf-Net في تطبيق .NET الخاص بي لاستسلسل ما يلي: (بتنسيق .proto)

message ProtoScreenBuffer {
optional int32 MediaId = 1;
optional bytes Data = 2;
optional bool LastBuffer = 3;
optional int64 StartTime = 4;
optional int64 StopTime = 5;
optional int32 Flags = 6;
optional int32 BufferSubType = 7;
optional int32 BufferType = 8;
optional Guid Guid = 9;
repeated int32 EncryptedDataStart = 10;
repeated int32 EncryptedDataLength = 11;
}

هدفي هو تسلسل هذا وحقنه في ملف ASF، كعينة واحدة.

أسمي هذا لتسلسل:

MemoryStream ms = new MemoryStream();
Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer));

ثم أحصل على صفيف بايت من كائن MS:

ms.ToArray();

وأنا وضعت هذه الصفيف البايت في المعرض المشكلة الكبيرة هي في تطبيق C ++ الخاص بي الذي يقرأ عينة ASF على ما يرام، أحصل على انتهاك وصول في الذاكرة عندما أحاول أن ألغى ذلك :(

هذا هو رمز C ++ الخاص بي:

m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen); 

(حيث m_screenbuffer هو protoscreenbuffer، serbuffer هو صفيف البايت الخام الذي حصلت عليه من ملف ASF، و DwinputDatalen هو طوله.)

هل أي من الأشياء التي أفعلها هنا خاطئة، لما أحاول القيام به (التسلسل في C # .NET و Deserialize في C ++؟)

شكرًا جزيلاً.

روي

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

المحلول

هم ... الشيء الوحيد هناك قد أتوقع أن يكون فوضوي هو Guid (أدركت مؤخرا أن ترميز هذا يبدو أنه جنون إلى حد ما). لذا أنا فكر في يجب أن تعمل بشكل جيد، وإعطاء أو تأخذ بعض الكود الفوضوي لفك تشفير Guid.

لاستبعاد خطأ الترميز، ما أقترحه هو:

  • تسلسل البيانات عبر C #، إلى ملف (أو مجرد إلقاء نظرة على البايت على الشاشة في المصحح)
  • تسلسل / نفس / البيانات عبر C ++، إلى ملف (أو مجرد إلقاء نظرة على البايت على الشاشة في مصحح الأخطاء)

ثم:

  • قارن بين بايت
  • تحقق من الطول هو ما تتوقعه (أي الرقم الذي تمر به)

يجب أن تشير إلى ما إذا كان الترميز، مقابل شيء ما يجب القيام به مع اجتياز عنوان الذاكرة الخطأ أو ما شابه ذلك.

أيضا - تحقق من أنك لا تستخدم GetBuffer() (أو على الأقل، إذا كنت فعل استعمال GetBuffer(), ، تأكد من استخدام .Length من MemoryStream, وليس من المتضخم byte[]).

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