【发布时间】:2013-09-06 19:51:21
【问题描述】:
我在一个类中有这个结构:
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)]
public struct MyStruct
{
public byte StartOfText;
public byte DisableChecksum;
public byte ProtocolVersion;
public byte Code;
public Int16 Size;
public byte[] Data;
public byte EndOfText;
public MyStruct(CommandCode commandCode, string commandData)
{
this.StartOfText = 0x02;
this.DisableChecksum = 0x00;
this.ProtocolVersion = 0x35;
this.Code = (byte)commandCode;
this.Size = (Int16)commandData.Length;
this.Data = new byte[commandData.Length];
this.Data = Encoding.ASCII.GetBytes(commandData);
this.EndOfText = 0x03;
}
public byte[] ToByteArray()
{
byte[] arr = null;
IntPtr ptr = IntPtr.Zero;
try
{
Int16 size = (Int16)Marshal.SizeOf(this);
arr = new byte[size];
ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(this, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
return arr;
}
}
现在,假设我在我的程序中初始化该结构的一个新实例,执行以下操作:
Protocol.MyStruct Cmd = new Protocol.MyStruct(CommandCode.LOAD_FILE, "TEST");
byte[] StructData = Cmd.ToByteArray();
初始化时,我可以看到 MyStruct.Data 正在使用字符串常量(0x54、0x45、0x53、0x54)的内容正确初始化。每个字符
但是当调用 MyStruct.TiByteArray() 并跟踪数组中的值时,数据部分现在是(0xa0、0xa6、0x91 和 0x03)。
数组的其余部分没问题,数据复制正确。
我缺少什么代码有什么问题?
【问题讨论】:
-
您的构造函数正在创建两个字节数组并丢弃第一个。
-
我的猜测是对字节数组的引用正在被序列化。
-
使用非托管内存 (
AllocHGlobal) 看起来有点矫枉过正
标签: c# struct type-conversion