¿Alguien puede decirme cómo obtener una matriz de bytes en una estructura de forma directa en C# .NET versión 2? Como el familiar fread
que se encuentra en C, hasta ahora no he tenido mucho éxito leyendo un flujo de bytes y completando automáticamente una estructura. He visto algunas implementaciones donde hay puntero hocus-pocus en el código administrado usando la palabra clave unsafe
.Un equivalente de C# del archivo fread de C
Tenga una mirada en esta muestra:
public unsafe struct foobarStruct{
/* fields here... */
public foobarStruct(int nFakeArgs){
/* Initialize the fields... */
}
public foobarStruct(byte[] data) : this(0) {
unsafe {
GCHandle hByteData = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pByteData = hByteData.AddrOfPinnedObject();
this = (foobarStruct)Marshal.PtrToStructure(pByteData, this.GetType());
hByteData.Free();
}
}
}
La razón por la que tengo dos constructores en foobarStruct
- es que no puede haber un constructor vacío.
- Pase un bloque de memoria (como una matriz de bytes) al constructor al crear una instancia de la estructura.
¿Es esa implementación lo suficientemente buena o hay una forma mucho más limpia de lograr esto?
Editar: No quiero utilizar la interfaz ISerializable o su implementación. Estoy tratando de leer una imagen binaria para calcular los campos utilizados y determinar sus datos utilizando las estructuras PE.
incluso en C, que es una muy mala idea directamente '' fread' en un struct' debido al relleno y alineación consideraciones –
Ha considerado el uso de serialización aquí en su lugar? –
Esta operación debe ocurrir dentro de un bloque inseguro porque es, bueno, inseguro. Una estructura podría contener miembros que apuntan a tipos de referencia, etc. Usted está pidiendo tomar bytes de disco desconocidos y lanzarlos a una estructura que pueda contener punteros a cualquier cosa. Es demasiado pedirle al marco que valide lo que está tratando de hacer, de ahí el bloque inseguro. Aún puede hacerlo, pero el marco debe adoptar un enfoque de "usted es independiente".La serialización maneja las preocupaciones subyacentes por usted, pero no se ajusta a todos los escenarios. No creo que va a hacer mucho mejor que el código que se muestra. –