怎样将从网络收到的有结构的包进行分解,举个例子从网上收到的包通过receivefrom接收到byte[]类型的buffer,假设这个buffer可看作三段,第一段是四字节的int,第二段是五字节的字符串,第三段是八字节的float,我定义了一个满足以上条件的结构体(或类对象),请问如何将这个buffer转化为这个结构(或对象),或者直接由这个结构或对象直接接收更好了。
---------------------------------------------------------------
推荐用unsafe代码
如果你的接受的流的对象格式很清楚,也可以用反序列化
---------------------------------------------------------------
你还不如直接传输为xml,一个xml一个包
---------------------------------------------------------------
关注
---------------------------------------------------------------
如果你的发送方也是.Net的应用程序,那么你可以把传送方式改改,使用Binary方式序列化一个结构,反序列化的时候可以直接反序列化成你的结构,具体使用请参考MSDN:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconbinaryserialization.htm
如果发送方不是.Net应用程序,而且发送的格式不能改,那么没有先成的方法直接序列化成你的结构,你只有手动的解析流的内容,一个字节一个字节读出来,然后按照你的格式转成你的值,关于把字节流转成Int和Float,你可以查查以前的贴子,有这方面的内容,FAQ里面好像也有
字符串的话,你需要知道编码方式,然后用Encoding.GetString的方法把字节数组转成相应编码的字符串
---------------------------------------------------------------
建议你用XML和WebService.
在客户端读取WEbService传来的DataSet可以满足你的要求
---------------------------------------------------------------
笨。
---------------------------------------------------------------
1. 如果Client/Server都是.NET,那么使用Serialization也许更好些——虽然回多一些额外的负荷。
2. 否则,如果只有这三个变量成员,那么简单一点的办法就是用BitConverter类从byte[]中依次读出来:BitConverter.ToInt32, ToString和ToDouble。
3. 更通用的方法,如下所示:
http://expert.csdn.net/Expert/topic/1764/1764944.xml?temp=5.108058E-03
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct {
//... your type member here.
}
...
MyStruct str = ...;
int sz = Marshal.SizeOf(typeof(MyStruct));
IntPtr buffer = Marshal.AllocHGlobal(sz);
Marshal.StructureToPtr(str, ptr, false);
byte[] mem = new byte[sz];
Marshal.Copy(buffer, mem, 0, sz);
Marshal.DestoryStructure(buffer);
Marshal.FreeHGlobal(buffer);
4. 上面的代码需要两次Copy内存,性能比较差。
如果可以使用unsafe代码的话,可以直接把byte[]指针转换成IntPtr, 可以省下一次内存Copy。
---------------------------------------------------------------
笨,笨,笨。。。
---------------------------------------------------------------
关注!
我也同样遇到这样的问题 :(
---------------------------------------------------------------
我在VB里面实现和C的同样的通讯问题~~
但是我不是saucer(思归, MS .NET MVP),TheAres(班门斧),timmy3310(tim)等大虾而且也没有星所以无可奉告~~~
说话不要那么绝~~小子!
---------------------------------------------------------------
嗯,问题不难解决,但是我没有资格解答!