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

rizher 2009-12-04 09:06:38
结构体定义的比较复杂 因为有些原因 我只把类型写上来 字段名称就代替一下

[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分送上~
...全文
481 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_ming_ming 2012-05-29
  • 打赏
  • 举报
回复
你好,我顺便问个问题啊 VC++和C# 共用一个struct? 怎么实现?
zzxap 2009-12-05
  • 打赏
  • 举报
回复
数据类型要相互对应和兼容
ares128 2009-12-05
  • 打赏
  • 举报
回复
c#的某些类型大小和C++的不一样的

都sizeof一下
addnext 2009-12-05
  • 打赏
  • 举报
回复
没有看明白呢
mutou1 2009-12-05
  • 打赏
  • 举报
回复
顶~~~~~~~
wartim 2009-12-05
  • 打赏
  • 举报
回复
貌似解决了,剩下就是jf了
skyworth98 2009-12-05
  • 打赏
  • 举报
回复
咩看太明白,不过有两个问题需要注意,一个是类型的大小,另一个是数据在内存中的对齐方式。
rizher 2009-12-05
  • 打赏
  • 举报
回复
今天出去一天 没有测试 不过VC崩溃前简单测了一下 好像没错 先给100分 剩下200分怎么办?我好像加不了分,版主帮忙 还是另开贴
mcdjxiao 2009-12-05
  • 打赏
  • 举报
回复
我 用的貌似是固定大小的结构题
huanqun1020 2009-12-05
  • 打赏
  • 举报
回复
学习
rizher 2009-12-04
  • 打赏
  • 举报
回复
VC崩溃了,明天晚上前结贴 来的都有分~~~~
flowerjack 2009-12-04
  • 打赏
  • 举报
回复
来学习的
soaringbird 2009-12-04
  • 打赏
  • 举报
回复
c++里的写法,在C#里往往有好几种对应的,根据实际情况试一试
rizher 2009-12-04
  • 打赏
  • 举报
回复
我太死板了,因为VC里面的结构体是char [40]
转到C#里面就是这样写的
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]

public char[] mm;
soaringbird 2009-12-04
  • 打赏
  • 举报
回复
存字符串呀,那别用这个了。
这样:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] 如果不行,试一下别的UnmanagedType
public string mm;

就可以sg.ss[0].mm=aa了。

rizher 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 soaringbird 的回复:]
项目属性里有开关。
sg.ss[0].mm = 1;不能这么访问
应该sg.ss[0].mm[0]=xx;
sg.ss[0].mm[1]=xx;......
[/Quote]
还是不太明白 比如原来
string aa = "1234";
sg.ss[0].mm = aa .PadRight(40, '\0').ToCharArray();
现在想给mm赋值怎么做呢
soaringbird 2009-12-04
  • 打赏
  • 举报
回复
项目属性里有开关。
sg.ss[0].mm = 1;不能这么访问
应该sg.ss[0].mm[0]=xx;
sg.ss[0].mm[1]=xx;......
rizher 2009-12-04
  • 打赏
  • 举报
回复
该帖已达到分数最大值,不允许加分操作。。。。
rizher 2009-12-04
  • 打赏
  • 举报
回复
打开unsafe开关 怎么做?
public unsafe fixed byte byte mm[40];现在我这样写的 没报错
还有就是这个在C#里面怎么初始化呢
public SG sg;
sg.ss[0].mm = 1; 报错了
懦芞 2009-12-04
  • 打赏
  • 举报
回复
up
加载更多回复(11)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧