日期:2014-05-18  浏览次数:20856 次

【300分】struct方面高手进!~VC和C#socket传输结构体接收数据不对的问题!
结构体定义的比较复杂 因为有些原因 我只把类型写上来 字段名称就代替一下

  [Serializable] // 指示可序列化
  [StructLayout(LayoutKind.Sequential)] 
  public struct Header
  {
  public uint aa;  
  public uint bb; 
  public uint cc; 
  public uint dd;  
  public ushort ee;  
  public ushort ff; 
  public ushort gg;  
  public uint hh;  
  public double ii; 
  }
  [StructLayout(LayoutKind.Sequential, Pack = 1)]
  public struct SS
  {
  public uint jj;
  public float kk;
  public EA eA;//这是enum
  public ET eT;//这是enum
  public ET2 eT2;//这是enum
  public short ll;
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)] // 声明一个字符数组,大小为40
  public char[] mm;  
  public SE sE;
  public float nn;
  public float oo;  
  }

  [StructLayout(LayoutKind.Sequential)]
  public struct SG
  {
  public Header header;
  public ushort pp;  
  public byte qq;  
  public byte ll;  
  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
  public SS[] ss;
  }

现在在C#之间发送struct SG,内容接收正确,
如果用VC赋值后发送SG这个结构体 其中
  public Header header;
  public ushort pp;  
  public byte qq;
的值可正确接收。  
  public byte ll;
但是SS这个结构体中的数据都是不对的。现在赋值的时候只定义了SS[0]的值。
把Header前改为[StructLayout(LayoutKind.Sequential, Pack = 1)] 接收数据就只剩下
  public uint aa;  
  public uint bb; 
  public uint cc; 
  public uint dd;  
  public ushort ee;  
  public ushort ff; 
  public ushort gg; 
是正确的了。。。
高手能给解答一下为什么吗??是内存对齐的问题吗?如何解决呢。300分送上~


------解决方案--------------------
char在VC是一个字节
在C#中是2个字节。
------解决方案--------------------
建议都使用byte来传吧。
使用每个类型的时候,最好先测试下他们的大小

而且内存对齐的字节数也要控制好。。
------解决方案--------------------
C++ C# 
char* string 
传出的char* StringBuilder 
short short 
char byte 
char[n] fixed byte[n] 
结构指针 结构指针 
函数指针 委托 
结构体数组使用IntPtr 
http://topic.csdn.net/u/20090225/15/a6bc50ad-9721-4749-b189-dc4a4bc045a1.html
------解决方案--------------------
UP
------解决方案--------------------
public char[] mm; 写成 public fixed byte mm[40]; 不要marshal,但是要加上unsafe并打开unsafe开关
------解决方案--------------------
探讨
怎么把帖子设置成300分呢。。

------解决方案--------------------
up