Structure to byte array and back

K

Ken Allen

Is there a relatively painless method for converting the contents of a
structure into a byte array and back again?

I have been using Marshal to do this, but it is a pain! To get the byte
array I have to Marshal.StructureToPtr() and then use Marshal.ReadByte()
to extract each of the bytes into an array individually. The reverse is
just as painful.

Is there no general purpose (safe) mechanism for achieving the same thing?

-ken
 
M

Mattias Sjögren

Ken,
and then use Marshal.ReadByte()
to extract each of the bytes into an array individually.

You can use Marshal.Copy to get them all at once.


Mattias
 
S

Stuart Irving

try this:

MemoryStream ms = new MemoryStream();

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(ms, myStruct);

return ms.ToArray();
 
P

Peter Bromley

Ken said:
Is there a relatively painless method for converting the contents of a
structure into a byte array and back again?

I have been using Marshal to do this, but it is a pain! To get the byte
array I have to Marshal.StructureToPtr() and then use Marshal.ReadByte()
to extract each of the bytes into an array individually. The reverse is
just as painful.

Is there no general purpose (safe) mechanism for achieving the same thing?

-ken

Well, as long as you are unconcerned with endian, versioning, or struct
layout issues, this C++ code below might help:

__value struct MyStruct
{
...
};

....
MyStruct myStruct;
....
// copy to Byte array
System::Byte dstBuffer __gc[] = new System::Byte[sizeof(MyStruct)];
System::Byte __pin* dstP = &dstBuffer[0];
*((MyStruct*)(void*)dstP) = myStruct;
....
// copy from byte array (srcBuffer)
System::Byte __pin* srcP = &srcBuffer[0];
MyStruct myStruct = *((MyStruct*)(void*)srcP);


I know it looks ugly but it does work assuming the constraints I
mentioned above.

Cheers, Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top