public struct MyX
{
public int IntValue;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.U1)]
public byte[] Array;
MyX(int i, int b)
{
IntValue = b;
Array = new byte[3];
}
public MyX ToStruct(byte []ar)
{
byte[] data = ar;//= { 1, 0, 0, 0, 9, 8, 7 }; // IntValue = 1, Array = {9,8,7}
IntPtr ptPoit = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, ptPoit, data.Length);
MyX x = (MyX)Marshal.PtrToStructure(ptPoit, typeof(MyX));
Marshal.FreeHGlobal(ptPoit);
return x;
}
public byte[] ToBytes()
{
Byte[] bytes = new Byte[Marshal.SizeOf(typeof(MyX))];
GCHandle pinStructure = GCHandle.Alloc(this, GCHandleType.Pinned);
try
{
Marshal.Copy(pinStructure.AddrOfPinnedObject(), bytes, 0, bytes.Length);
return bytes;
}
finally
{
pinStructure.Free();
}
}
}
void function()
{
byte[] data = { 1, 0, 0, 0, 9, 8, 7 }; // IntValue = 1, Array = {9,8,7}
IntPtr ptPoit = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, ptPoit, data.Length);
var x = (MyX)Marshal.PtrToStructure(ptPoit, typeof(MyX));
Marshal.FreeHGlobal(ptPoit);
var MYstruc = x.ToStruct(data);
Console.WriteLine("x.IntValue = {0}", x.IntValue);
Console.WriteLine("x.Array = ({0}, {1}, {2})", x.Array[0], x.Array[1], x.Array[2]);
}
你想使用'byte []'的唯一原因是能够调用'WriteAllBytes'吗?还有其他“更安全”的技术,例如使用BinaryWriter或BinaryFormatter。 – nicholas
今天我遇到了一篇文章,描述了一种做本来想做的事情的方法,但是它涉及到一个混合语言项目:混合使用C#和C++/CLI:http://www.codeproject.com/Articles/33713/ Generic-BinaryReader-and-BinaryWriter-Extensions – nicholas
谢谢。我快速看了一下,但是我有点担心。它似乎做了我想避免的副本。另外,要像枚举一样使用枚举,我们可以使用属性“标志”。通过使用C#流,我认为我们有相同的结果,而不必混合2种不同的语言。但是非常感谢,如果我还有其他字节转换问题,我会牢记这一点,并会回到这里。 –