如何将C#结构转换为字节数组

如何将C#结构转换为字节数组,c#,arrays,struct,char,copy,C#,Arrays,Struct,Char,Copy,我有一个要通过TCP协议发送到TCP客户端的结构,因此我要将此结构数据分配或复制到字节数组: struct StartReadXML { public int CmdID;//3 public char[] CmdName;//ReadXML public char[] Description;//Other data }; 此处我将数据分配给结构数据成员,如下所示: StartReadXML startXML=new StartRead

我有一个要通过TCP协议发送到TCP客户端的结构,因此我要将此结构数据分配或复制到字节数组:

struct StartReadXML
   {
       public int CmdID;//3
       public char[] CmdName;//ReadXML
       public char[] Description;//Other data

   };
此处我将数据分配给结构数据成员,如下所示:

StartReadXML startXML=new StartReadXML();
startXML.CmdID = 3;
startXML.CmdName = "sreedhar".ToCharArray();
startXML.Description = "Kumar".ToCharArray();
现在,我想把它分配给一个字节数组。我正在使用编组进行以下操作:

int sizestartXML = Marshal.SizeOf(startXML);//Get size of struct data
byte[] startXML_buf = new byte[sizestartXML];//byte array & its size
IntPtr ptr = Marshal.AllocHGlobal(sizestartXML);//pointer to byte array
Marshal.StructureToPtr(startXML, ptr, true);
Marshal.Copy(ptr, startXML_buf, 0, sizestartXML);
Marshal.FreeHGlobal(ptr);

//Sending struct data  packet
stm.Write(startXML_buf, 0, startXML_buf.Length);//Modified
但是,它在Structuretoptr转换方法中失败。请帮助以字节形式传输结构数据,我将使用上述步骤。
提前感谢微笑|:)

不能对大小可变的数组调用
StructureToPtr

这归结起来就是,除非您知道
CmdName
的大小并声明它-例如,如果大小为20个字符,如下所示:

public fixed char[] CmdName[20];
您将收到一个来自元帅的异常消息,称您的结构不是不可空袭的,就是无法获得有意义的大小

这是CLR强加的要求,您无法解决

另一种方法是使用
Convert
类或序列化程序手动转换结构的成员,但除非事先知道这些数组的大小,否则将无法使用
StructureToPtr
string
类型也是如此,我假设这就是您的char数组将包含的内容


考虑使用
MemoryStream
并将值写入流,然后改为使用
stream.ToArray()
发送流的内容。

考虑到不能简单地将结构转换为二进制,请使用以下示例:

class StartReadXML
{
    public int CmdID;//3
    public string CmdName;//ReadXML
    public string Description;//Other data
}
然后:

请注意,这里我使用的是一个“可变长度”数据包:
CmdName
Description
的长度不是固定的(而
BinaryWriter
/
BinaryReader
通过预加字符串长度来处理这个问题)


相反,当您有一个具有固定长度字符串的固定长度数据包时。这需要完全不同的处理。

您是否考虑过使用
二进制格式化程序序列化对象?
var srx = new StartReadXML();
srx.CmdID = 3;
srx.CmdName = "sreedhar";
srx.Description = "Kumar";

// Example of how to Write to byte[] buffer

byte[] buffer;

using (var ms = new MemoryStream())
{
    using (var bw = new BinaryWriter(ms, Encoding.UTF8))
    {
        bw.Write(srx.CmdID);
        bw.Write(srx.CmdName);
        bw.Write(srx.Description);
    }

    buffer = ms.ToArray();
}

// Example of how to Read from byte[] buffer

var srx2 = new StartReadXML();

using (var ms = new MemoryStream(buffer))
{
    using (var br = new BinaryReader(ms, Encoding.UTF8))
    {
        srx2.CmdID = br.ReadInt32();
        srx2.CmdName = br.ReadString();
        srx2.Description = br.ReadString();
    }
}