2012-03-12 14 views
6

En Delphi, uno puede hacer lo siguiente:Escribir casos tipo arbitrario en un MemoryStream en C#

var 
    ms : TMemoryStream; 
    i : Integer; 
begin 
    ms := TMemoryStream.Create; 
    i := 1024; 
    ms.Write(@i, SizeOf(Integer)); 
    ms.Free; 
end; 

Esto escribirá los contenidos de la memoria de i en ms.

La versión .Net de MemoryStream no tiene esa característica (ni las versiones administradas ni no administradas). Sé que .Net no funciona con los mismos principios que Delphi en este sentido.

¿Cómo se hace esto en C#? Estoy interesado en la "mejor práctica" y los métodos más rápidos.

+0

SizeOf() lo determina el compilador, no en tiempo de ejecución. Este estilo de serialización es sorprendentemente rápido y simple. – IamIC

Respuesta

4

Pruébalo BinaryWriter cantar en la parte superior de MemoryStream:

MemoryStream memoryStream = new MemoryStream(); 
BinaryWriter writer = new BinaryWriter(memoryStream); 
writer.Write((int)123); 

Nota: no se olvide de disponer arroyos y escritores/lectores de código real, es decir, por using.

+0

¡Este es el indicado! Gracias @Alexei. – IamIC

+0

Olvidó vincular la transmisión al escritor. –

+0

@HenkHolterman, gracias - actualizado. –

6

Puede Serialice el objeto en una matriz de bytes

// Convert an object to a byte array 
private byte[] ObjectToByteArray(Object obj) 
{ 
    if(obj == null) 
     return null; 
    BinaryFormatter bf = new BinaryFormatter(); 
    MemoryStream ms = new MemoryStream(); 
    bf.Serialize(ms, obj); 
    return ms.ToArray(); 
} 

// Convert a byte array to an Object 
private Object ByteArrayToObject(byte[] arrBytes) 
{ 
    MemoryStream memStream = new MemoryStream(); 
    BinaryFormatter binForm = new BinaryFormatter(); 
    memStream.Write(arrBytes, 0, arrBytes.Length); 
    memStream.Seek(0, SeekOrigin.Begin); 
    Object obj = (Object) binForm.Deserialize(memStream); 
    return obj; 
} 

y luego usar MemoryStream a escribir como quería

byte[] mData = ObjectToByteArray(myObject); 
MemoryStream memStream = new MemoryStream(); 
memStream.write(mData, 0, mData.Length); 

EDIT: Si desea escribir un entero, el uso

byte[] mData = BitConverter.GetBytes((UInt16)iInteger); 
memStream.write(mData, 0, mData.Length); 
+1

Gracias. Esto está serializando todo el objeto, no solo el valor. Por lo tanto, un entero se almacena como 36 bytes. Solo quiero el valor 4. – IamIC

2

. Las transmisiones .NET solo se ocupan de los datos byte.

para escribir cualquier otro tipo de datos, es necesario una 'pieza final':

  • BinaryWriter para escribir los valores primitivos (int, double, string)
  • TextWriter escribir carbón y líneas, utilizando una codificación
  • un serializador (muchos choicess) para escribir objetos

Así, en su caso:

var writer = new BinaryWriter(myStream); 
writer.Write(i); // writes 4 bytes only 
+0

gracias por explicar qué usar cuando. Tiene sentido para mí ahora. – IamIC

Cuestiones relacionadas