Domanda

Sto usando protobuf-Net nella mia applicazione .NET per serializzare il seguente: (in formato 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;
}

Il mio obiettivo è quello di serializzare questo e iniettare in un file ASF, come un singolo campione.

Io chiamo questo serializzare:

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

allora ottengo un array di byte dall'oggetto ms:

ms.ToArray();

e ho messo questo array di byte in ASF. Il grosso problema è sul mio ++ app C che legge il campione ASF bene, ho una violazione di accesso di memoria quando si tenta di deserializzare esso: (

Questo è il mio codice C ++:

m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen); 

(dove è m_screenBuffer ProtoScreenBuffer, serBuffer è l'array di byte grezzo ho ottenuto dal file ASF e dwInputDataLen è la lunghezza di esso.)

sono una delle cose che sto facendo qui sbagliato, per quello che sto cercando di fare (serializzare in C # .NET e deserializzare in C ++?)

Grazie mille.

Roey

È stato utile?

Soluzione

Hmm ... l'unica cosa in là che potrei aspetto di essere disordinato è il Guid (di recente ho capito che la mia codifica di questo sembra essere abbastanza pazzo-endian). Così I pensare che dovrebbe funzionare bene, più o meno un certo codice disordinato di decifrare il Guid.

Per escludere un errore di codifica, quello che vorrei suggerire è:

  • serializzare i dati tramite C #, in un file (o semplicemente guardare i byte sullo schermo nel debugger)
  • serializzare gli stessi / dati / via C ++, in un file (o semplicemente guardare il byte sullo schermo nel debugger)

Quindi:

  • confrontare i byte
  • controllare la lunghezza è ciò che ci si aspetta (vale a dire il numero che si sta passando sopra)

Questo dovrebbe far sapere se è la codifica, vs qualcosa a che fare con il passare l'indirizzo di memoria sbagliato o simile.

Inoltre - controllare non si utilizza GetBuffer() (o almeno, se si non uso GetBuffer(), assicurarsi di utilizzare il .Length dal MemoryStream, e non dal byte[] sovradimensionato)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top