结构体中能不能定义变长的数组? 照你的方法传个OBJECT进来就成了吧剩下的都是方法内部的事情了~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 变长数组,建议更换为ArrayList。 定义一个arraylist,可那也得写一个特性[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]的呀,这里还是把长度给限制了 为什么要写。直接New一个空的就ok了。 这个根本就是不可能的,定长的数组决定了一次传送的字节始终是固定的长度,接收端收到的数据也能够按照这个长度恢复成对象,如果设置为变长就算是发送出去了接收端因为不知道发送的字节数是多少,根本就不可能解析出来。其根本原因还是数组在C#里面都是引用类型,而不是值类型。同理字符串也是一样的需要用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]声明想一下C++里面的结构的字段声明成指针再用Socket发送出去会是什么样的情况吧 自已写个辅助方法把结构的一个字段一个字段的写到内存流中,遇到数组或字符串这种长度不定的类型先写入一个或两个字节表示长度的值,把数组元素或字符串转成后的字节数组的内容一个一个输出再把内存流的内容发送到Socket里去,我就是这样干的 public struct Data { public string UsersName; public byte[] ByteData; }public byte[] GetBytes(Data d){ MemoryStream ms = new MemoryStream(); byte[] strArray = d.UserName == null ? new byte[0] : Encoding.UTF8.GetBytes(d.UserName); ms.WriteByte((byte)strArray.Length); // 这里到底是用什么整型表示长度由事先约定,发送和接收端使用一样的就行,必要时可用BitConverter类的方法转换,下同 ms.Write(strArray, 0, strArray.Length); if(d.ByteData == null) ms.Write(0); else { ms.WriteByte((byte)d.ByteData.Length); ms.Write(d.ByteData, 0, d.ByteData.Length); } return ms.ToArray();} 解析的时候先读取一个长度,由之前的约定决定到底读几个字节表示长度,根据这个长度再决定后面需要读取的数据块,这样基本上就可以还原了。需要注意的是发送时写入流的顺序和接收端分析还原字段的顺序是一致的,也就是说先发送的是UserName,那么先分析到的也是UserName 变长数组,直接用List就可以了 c#如何利用已有对象重复多次执行sql语句并返回结果 jquery调用ajax 局域网内,知道一台机子的MAC地址,如何取得它的IP地址?? c#中调用c++写的dll的问题 C#套表打印 数据备份 字符型数据转化为时间类型时出错,帮忙改正啊。急!在线等! 添加新行更新数据后,怎么获取ID字段值 System Clipboard 我删掉了有关于《C#必败》的贴子 ASP.NET Ajax 控件ToggleButton,SliderExtender,ResizableControl 学习笔记 关于 wpf 3D 显示透明问题, 达人指教!(前面一个帖子有问题,Sorry!)
同理字符串也是一样的需要用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]声明想一下C++里面的结构的字段声明成指针再用Socket发送出去会是什么样的情况吧
再把内存流的内容发送到Socket里去,我就是这样干的 public struct Data
{
public string UsersName;
public byte[] ByteData; }public byte[] GetBytes(Data d)
{
MemoryStream ms = new MemoryStream();
byte[] strArray = d.UserName == null ? new byte[0] : Encoding.UTF8.GetBytes(d.UserName);
ms.WriteByte((byte)strArray.Length); // 这里到底是用什么整型表示长度由事先约定,发送和接收端使用一样的就行,必要时可用BitConverter类的方法转换,下同
ms.Write(strArray, 0, strArray.Length);
if(d.ByteData == null)
ms.Write(0);
else
{
ms.WriteByte((byte)d.ByteData.Length);
ms.Write(d.ByteData, 0, d.ByteData.Length);
}
return ms.ToArray();
}
解析的时候先读取一个长度,由之前的约定决定到底读几个字节表示长度,根据这个长度再决定后面需要读取的数据块,这样基本上就可以还原了。
需要注意的是发送时写入流的顺序和接收端分析还原字段的顺序是一致的,也就是说先发送的是UserName,那么先分析到的也是UserName