首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【300分】struct方面~VC和C#socket传输结构体接收数据不对的有关问题

2012-05-29 
【300分】struct方面高手进!~VC和C#socket传输结构体接收数据不对的问题!结构体定义的比较复杂 因为有些原因

【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

[解决办法]
项目属性里有开关。
sg.ss[0].mm = 1;不能这么访问
应该sg.ss[0].mm[0]=xx;
sg.ss[0].mm[1]=xx;......
[解决办法]
来学习的
[解决办法]
c#的某些类型大小和C++的不一样的 

都sizeof一下
[解决办法]

[解决办法]
咩看太明白,不过有两个问题需要注意,一个是类型的大小,另一个是数据在内存中的对齐方式。
[解决办法]
貌似解决了,剩下就是jf了
[解决办法]
没有看明白呢
[解决办法]
数据类型要相互对应和兼容
[解决办法]
学习
[解决办法]
我 用的貌似是固定大小的结构题

热点排行