Manejo de uniones en C#

30/09/2005 - 15:58 por nahuel | Informe spam
Necesito manejar uniones en c#. La unión debe contener
una estructura y un byte[] para poder ir recorriendo la
estructura de a bytes ya que estos serán enviados a un
servidor a través de una conexión socket.
Los datos que contiene la estructura son de distintos
tipos.

Gracias !
 

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
30/09/2005 - 17:32 | Informe spam
Para simular un union debes usar una estructura a la que le aplicas el
atributo StructLayout(LayoutKind.Explicit) y luego alinear los campos con
[FieldOffset]. Por ejemplo:

[StructLayout(LayoutKind.Explicit)]
public struct Union {
[FieldOffset(0)] public byte a;
[FieldOffset(0)] public int b;
}

El problema es que no puedes mezclar objetos (el array) con datos que no son
objetos (int, byte, etc.) ni tampoco sirve para hacer conversiones (por
ejemplo un campo string y otro byte[]).

Si la idea de la union es solo obtener como array de bytes el contenido de
la union en lugar de hacer una union agregale un metodo a la estructura que
te devuelva el contenido en forma de array de bytes o serializa la
estructura usando BinaryFormatter o una combinacion de ambas para
simplificar. Por ejemplo:

[Serializable()]
public struct MiEstructura{

public string a;
public int b;

// Convierte la estructura en un array de bytes
public byte[] ToByteArray() {

BinaryFormatter bin = new BinaryFormatter();
MemoryStream stream = new MemoryStream();

try {
bin.Serialize(stream, this);
return stream.GetBuffer();
} finally {
stream.Close();
}

}

// Convierte un array de bytes en la estructura
public static MiEstructura FromByteArray(byte[] data) {

BinaryFormatter bin = new BinaryFormatter();
MemoryStream stream = new MemoryStream(data);

try {
return (MiEstructura) bin.Deserialize(stream);
} finally {
stream.Close();
}

}

}

Eso si, usando serializacion va a ocupar mas bytes que la data real porque
incluye informacion del tipo para poder deserializar.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C

Preguntas similares