首页 新闻 赞助 找找看

C# 与 C++ Socket通讯中,结构的定义中数组长度问题

1
悬赏园豆:20 [已解决问题] 解决于 2011-04-22 10:37

1 public class NMT_VLDATA<T1, T2>
2 {
3 [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray,SizeConst=2)]
4 public T2[] Data;
5 }
SizeConst=2 ,这个值 怎么能动态设置,或者其他实现相同效果的解决方案也行

各种对象 都用这一个模板,接收的时候需要指定对象的SIZE

因为C++那边来的数据数量不一定,而且这个结构很多个对象会用到,我不能定义这么多对象去实现,还尝试过用字符串拼出一个类,编译,反射实例化不过没有成功,编译过程失败了

Marvel的主页 Marvel | 初学一级 | 园豆:98
提问于:2011-04-20 17:25
< >
分享
最佳答案
0

没法动态设置,你必须改变策略。

将 T2[] Data 修改为如下:

IntPtr Data;

然后你需要一个机制知道 T2[] 数组的长度,一种方式是被调用方会显示告诉你一个 ContentLength,

另一种方式,被调用方约定读到某个特殊字符(比如 0XFF)后就停止读取。

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2011-04-21 09:14
改成IntPtr Data后,Data是一个负值,其他字段的值正常,T2的长度可以知道
Marvel | 园豆:98 (初学一级) | 2011-04-21 16:16
谢谢,Galactica的耐心指点
Marvel | 园豆:98 (初学一级) | 2011-04-22 10:37
其他回答(1)
0

相互通信的话,简单的话可以传递字节数组,然后使用array数组偏移进行数据组包或拆分。这个方法麻烦在于需要自己实现每个结构的组包或拆包。实现上全部利用.net自身平台,不用互操作等。

另外可以利用json方法,传递字符流。直接绑定实体,再也不用关心长度问题或者字节对齐的问题了。这个方法从数据流量上也比较少。唯一的缺点就是binary信息需要base64编码或其它处理。因为交互的是字符流而不是字节流。

febwave | 园豆:212 (菜鸟二级) | 2011-04-21 09:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册