CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

C# 结构体 byte[]数组转换

楼主Steven_luo(罗弈)2005-01-05 17:50:43 在 .NET技术 / C# 提问

问题是这样的,做一个Socket程序,客户端用的C++,服务器端用C#,两边都定义了相同的结构体,问题如何把C#的结构体转换成byte[]发送到客户端,还有就是,如何把客户端发送过来的byte[]转换成一个结构体?  
   
  希望有做过这方面程序的朋友给点提示! 问题点数:20、回复次数:20Top

1 楼wuyazhe(wyz&xyl)回复于 2005-01-05 17:58:44 得分 0

友情upTop

2 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-01-05 18:05:58 得分 0

序列化后传输。Top

3 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2005-01-05 18:12:04 得分 0

将你的结构体前面加上属性Serializable,然后用BinaryFormatter类序列化和反序列化。Top

4 楼Steven_luo(罗弈)回复于 2005-01-06 09:16:57 得分 0

我试试!谢谢你!  
  那byte[]转换成struct如何做呢?Top

5 楼zlopen(MadeInChina)回复于 2005-01-06 09:22:09 得分 0

谁能给个具体的例子,我也碰到了相同的问题Top

6 楼Steven_luo(罗弈)回复于 2005-01-06 15:03:42 得分 0

楼下的,等你知道了一定要告诉我啊!Top

7 楼ET2004(外星人)回复于 2005-01-21 21:54:36 得分 0

BinaryFormatter   序列化后的数据还是会包含额外信息,不仅仅是结构体的内容而已。Top

8 楼ET2004(外星人)回复于 2005-01-21 21:55:02 得分 0

我也遇到跟楼主一样的问题,期待答案。Top

9 楼drk928(一起看斜阳)回复于 2005-01-21 22:09:40 得分 0

将结构体对象序列化成一个XML文件,然后传输后,在接收方再转换回来.Top

10 楼FJGoodGood(_FJ_强中强)回复于 2005-01-21 22:13:28 得分 0

我明白楼主的意思了。  
  你可以尝试这样:  
   
  public   struct   MyStruct  
  {  
  int   i;  
  int   j;  
  }  
   
  unsafe   byte[]   SaveMyStruct(MyStruct*   st)  
  {  
  int   len   =   sizeof(MyStruct);  
  MessageBox.Show(len.ToString());  
  byte[]   buf   =   new   byte[len];  
  byte*   p   =   (byte*)st;  
  for   (int   i=0;   i<len;   i++)  
  {  
  buf[i]   =   *p++;  
  }  
  return   buf;  
  }  
   
  private   void   button1_Click(object   sender,   System.EventArgs   e)  
  {  
  MyStruct   st   =   new   MyStruct();  
  unsafe  
  {  
  byte[]   buf   =   SaveMyStruct(&st);  
  MessageBox.Show(buf.Length.ToString());  
  }  
   
  }  
  Top

11 楼webserv2(New life New job)回复于 2005-01-21 22:29:01 得分 0

OBJECT对象序列化转换为byte[]   byte[]反序列化转换为OBJECT对象    
  http://www.cnblogs.com/contlu/archive/2005/01/19/94178.html  
    '参考:http://blog.csdn.net/freehul/archive/2005/01/19/258787.aspx  
          '将Image对象和byte[]互相转换    
   
   
          Public   Shared   Function   ReadObject()Function   ReadObject(ByVal   obj   As   Object)   As   Byte()  
                  Dim   ms   As   MemoryStream   =   New   MemoryStream  
                  Dim   bf   As   BinaryFormatter   =   New   BinaryFormatter  
                  bf.Serialize(ms,   obj)  
                  ms.Close()  
                  Return   ms.ToArray()  
          End   Function  
   
          Public   Shared   Function   GetObject()Function   GetObject(ByVal   bytes   As   Byte())   As   Object  
                  Dim   ms   As   MemoryStream   =   New   MemoryStream(bytes,   0,   bytes.Length)  
                  Dim   bf   As   BinaryFormatter   =   New   BinaryFormatter  
                  Return   bf.Deserialize(ms)  
   
          End   Function  
  Top

12 楼ET2004(外星人)回复于 2005-01-22 01:37:15 得分 10

如果发送端和接收端都是   .NET   应用程序,用序列化比较方便,而且不用接触到   Marshal   或   unsafe   代码。虽然序列化的数据里会包含一些额外的数据,如:程序集名称、版本、公钥等,看似冗余,其实对版本控制是有好处的。  
   
  不过楼主已经说得很明白了,客户端是   C++,服务端是   C#,那用序列化就不是很现实了,除非是用   VC.NET   并使用托管代码,这样的情况可以参考这篇帖子:  
  http://community.csdn.net/Expert/topic/3466/3466293.xml?temp=.6052515  
   
  可以“比较”完美得实现   struct   <->   byte[]   的互相转换。Top

13 楼fengyecsdn(幸福的屁颠颠~HOHO 最近事业爱情都顺利!加油)回复于 2005-01-22 02:31:36 得分 0

上边说的差不多了    
  不过我只提醒一点!  
  一边用C++一边用C#   要注意结构内容的存放顺序问题。  
  如果不显式确定,而用内存快顺存放转换。两边的顺序是不同的Top

14 楼yanransoft()回复于 2005-01-25 02:42:32 得分 0

markTop

15 楼Henry0(Westwolf|西山狼)回复于 2005-01-25 06:06:00 得分 0

那byte[]转换成struct如何做呢?  
   
  --->  
   
  那应该是自己手工拼凑了吧,你知道结构体的结构、成员,按顺序一个一个换好了,可以写个转换函数  
   
  struct   mystruct   change(byte[]   b)Top

16 楼FJGoodGood(_FJ_强中强)回复于 2005-01-25 09:53:16 得分 10

unsafe   MyStruct   ReadMyStruct(byte[]   buf)  
  {  
  MyStruct   st   =   new   MyStruct();  
  byte*   p   =   (byte*)st;  
  int   len   =   sizeof(MyStruct);  
  for   (int   i=0;   i<len;   i++)  
  {  
  *p++   =   buf[i];  
  }  
  return   st;  
  }  
   
  private   void   button1_Click(object   sender,   System.EventArgs   e)  
  {  
  MyStruct   st   =   new   MyStruct();  
  unsafe  
  {  
  byte[]   buf   =   SaveMyStruct(st);  
  ...  
  st   =   ReadMyStruct(buf);  
  MessageBox.Show(st.i.ToString());  
  }  
   
  }Top

17 楼flyjiebing(fly)回复于 2005-01-25 10:03:19 得分 0

如果效率不是问题的话,何不用xml来交换数据?Top

18 楼egyptcaesar(笨小孩)回复于 2005-03-16 10:54:57 得分 0

不能用序列化,序列化后包含无用信息!应该使用非托管方式  
  参考,Structertoptr   和   ptrtoStructer函数Top

19 楼Steven_luo(罗弈)回复于 2005-03-21 11:08:32 得分 0

好久没有上来了,谢谢各位!我先看看帖子!Top

20 楼fengyecsdn(幸福的屁颠颠~HOHO 最近事业爱情都顺利!加油)回复于 2005-04-13 11:34:17 得分 0

其实序列化也有麻烦.  
  如果结构数据不是太多太复杂,  
  有个比较实际的办法,就是自己手动序列.  
  自己写几个解编函数,把结构中的基础数据转换为BYTE[]队列,再才传输就可以了.  
  Top

相关问题

  • 在C++里怎么把char数组转换成byte数组
  • BYTE数组和String转换
  • byte数组转换成integer
  • string和byte数组的相互转换~~
  • string如何转换为byte数组?
  • byte数组 与 char数组 互相转换问题?
  • 简单求教(如何将BYTE数组转换成char数组)
  • 怎么样将string转换为byte数组和byte数组转换为string?
  • c#中地址指针的问题,知道一个Byte[]数组,怎样得知数组的地址?并将地址转换成IntPtr类型??
  • 数组 转换...

关键词

  • c#
  • c++
  • 转换
  • 结构
  • 序列化
  • 客户
  • 结构体
  • mystruct
  • byte
  • 顺序

得分解答快速导航

  • 帖主:Steven_luo
  • ET2004
  • FJGoodGood

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo