困惑我几个月的难题,非星级高手不要进来浪费时间

gogogo 2003-05-23 03:37:49
怎样将从网络收到的有结构的包进行分解,举个例子从网上收到的包通过receivefrom接收到byte[]类型的buffer,假设这个buffer可看作三段,第一段是四字节的int,第二段是五字节的字符串,第三段是八字节的float,我定义了一个满足以上条件的结构体(或类对象),请问如何将这个buffer转化为这个结构(或对象),或者直接由这个结构或对象直接接收更好了。
...全文
44 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gogogo 2003-05-27
  • 打赏
  • 举报
回复
首先谢谢qqchen79(知秋一叶 [MS MVP]) ,并谢谢各位的参与,为了吸引大家的注意,使用了一些特别的词语,请各位原谅
nean 2003-05-24
  • 打赏
  • 举报
回复
笨,笨,笨。。。
emilio 2003-05-24
  • 打赏
  • 举报
回复
嗯,问题不难解决,但是我没有资格解答!
cherno 2003-05-24
  • 打赏
  • 举报
回复
我在VB里面实现和C的同样的通讯问题~~
但是我不是saucer(思归, MS .NET MVP),TheAres(班门斧),timmy3310(tim)等大虾~~而且也没有星~~所以无可奉告~~~
说话不要那么绝~~小子!
tpwang 2003-05-24
  • 打赏
  • 举报
回复
关注!
我也同样遇到这样的问题 :(
qqchen79 2003-05-24
  • 打赏
  • 举报
回复
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。
binbin2000 2003-05-23
  • 打赏
  • 举报
回复
笨。
飞不动 2003-05-23
  • 打赏
  • 举报
回复
建议你用XML和WebService.
在客户端读取WEbService传来的DataSet可以满足你的要求
gogogo 2003-05-23
  • 打赏
  • 举报
回复
"关于把字节流转成Int和Float,你可以查查以前的贴子,有这方面的内容,FAQ里面好像也有"
用什么关键字在哪里查,请告诉我好吗?
gogogo 2003-05-23
  • 打赏
  • 举报
回复
timmy3310(Tim) 你来了,我很高兴,我实说了吧,我在开发一个使用ICMP的程序,我知道ICMP的格式,我看过类似的C++程序,很容易懂,我想写个C#的这才发现没法将收到的包转化到结构中,自然我没法使用序列化。我只希望如果不知道解决办法,请告诉我几个可能有这方面信息的网站也可以,谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
timmy3310 2003-05-23
  • 打赏
  • 举报
回复
如果你的发送方也是.Net的应用程序,那么你可以把传送方式改改,使用Binary方式序列化一个结构,反序列化的时候可以直接反序列化成你的结构,具体使用请参考MSDN:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconbinaryserialization.htm


如果发送方不是.Net应用程序,而且发送的格式不能改,那么没有先成的方法直接序列化成你的结构,你只有手动的解析流的内容,一个字节一个字节读出来,然后按照你的格式转成你的值,关于把字节流转成Int和Float,你可以查查以前的贴子,有这方面的内容,FAQ里面好像也有

字符串的话,你需要知道编码方式,然后用Encoding.GetString的方法把字节数组转成相应编码的字符串
tjq_tang 2003-05-23
  • 打赏
  • 举报
回复
关注
gogogo 2003-05-23
  • 打赏
  • 举报
回复
难道.net framework不能实现吗?而且我接受的包是一个其它机器发回来的,我没法控制它,我只知道他发来的包的结构,我不能对他序列化,应为这个问题在C、C++中很简单,但是在VB、Delphi中很难实现,现在我觉得C#功能挺强大的,没想打着也要借助unsafe的指针,这使我很失望,难道这里没有在VB或Delphi中解决过类似问题的人吗?
gogogo 2003-05-23
  • 打赏
  • 举报
回复
saucer(思归, MS .NET MVP),TheAres(班门斧),timmy3310(tim)等大虾都在哪里?来指导指导小弟了。
platform 2003-05-23
  • 打赏
  • 举报
回复
你还不如直接传输为xml,一个xml一个包
coollzh 2003-05-23
  • 打赏
  • 举报
回复
推荐用unsafe代码

如果你的接受的流的对象格式很清楚,也可以用反序列化

110,567

社区成员

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

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

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