Pregunta

Tenemos una aplicación en la que necesitamos deserializar algunos datos de una secuencia en varios objetos.

La matriz de datos representa una cantidad de mensajes de longitud variable empaquetados. No hay códigos de delimitación de mensajes en la secuencia.

Queremos hacer algo como:

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  

donde cada llamada de ProcessData sabe dónde comenzar en la matriz. Lo ideal sería hacer esto sin pasar una referencia de DataIx .

Para hacer esto en C ++, simplemente pasaríamos un puntero a la matriz, y cada función ProcessData lo incrementaría según sea necesario.

Cada clase de objeto sabe cómo se serializan sus propios mensajes y se puede confiar en ellos (en C ++) para devolver el puntero al comienzo del siguiente mensaje en la secuencia.

¿Hay algún mecanismo incorporado que podamos usar para hacer esto (sin ir a inseguro )? La operación es de alta frecuencia (~ 10kps) y muy ligera. Tampoco queremos copiar o recortar la matriz.

Gracias por su ayuda.

¿Fue útil?

Solución

¿No podría simplemente pasar y devolver el índice de matriz? Eso es básicamente todo lo que un puntero es de todos modos, un desplazamiento desde una ubicación de memoria fija.

Otros consejos

Bueno, esto suena como si quisieras una secuencia simple (por ejemplo, usa MemoryStream como envoltorio alrededor de tu conjunto de bytes: stream = new MemoryStream (datos)). Simplemente envuelve el conjunto de bytes en una secuencia y cada objeto lee tanto de la secuencia como lo necesita y luego entrega la secuencia al siguiente elemento. Incluso tiene la ventaja de que no está obligado a cargar todo el conjunto de bytes a la vez.

Aparte de eso, puede usar punteros en C # exactamente como lo hizo en C ++ (aunque los punteros requieren la palabra clave insegura y no se recomiendan)

Alternativamente, podría pasar datos y una variable de índice y luego incrementar el índice (que es, de hecho, lo mismo que usar un puntero pero no necesita ser inseguro).

¿Qué tal envolver los datos en un MemoryStream y luego pasar un StreamReader al método ExtractMessage?

Creo que se me ocurren varias cosas.

Puede simular la acción del puntero envolviendo el byte [] en una clase que también mantiene el desplazamiento de la matriz. Cada vez que accede a la matriz, accedería a través de la clase, probablemente a través de un método de acceso, que devolvió el siguiente byte y también incrementó la variable de desplazamiento. La instancia de clase se puede pasar entre las diferentes llamadas a la función ExtractMessage.

¿Qué tal usar C ++ / CLI? Esto le permitiría usar técnicas familiares de C / C ++ y, sin embargo, ser directamente invocable desde C # sin la temida interoperabilidad.

Luego, por supuesto, existe la temida opción insegura, por la cual obtiene un puntero C # al byte [] y realiza la aritmética del puntero requerida.

Puede crear una secuencia a partir de la matriz de bytes.

Stream stream = new MemoryStream(data);

Entonces su procesador podría funcionar en secuencias en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top