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

Steven_luo 2005-01-05 05:50:43
问题是这样的,做一个Socket程序,客户端用的C++,服务器端用C#,两边都定义了相同的结构体,问题如何把C#的结构体转换成byte[]发送到客户端,还有就是,如何把客户端发送过来的byte[]转换成一个结构体?

希望有做过这方面程序的朋友给点提示!
...全文
1988 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyecsdn 2005-04-13
  • 打赏
  • 举报
回复
其实序列化也有麻烦.
如果结构数据不是太多太复杂,
有个比较实际的办法,就是自己手动序列.
自己写几个解编函数,把结构中的基础数据转换为BYTE[]队列,再才传输就可以了.
Steven_luo 2005-03-21
  • 打赏
  • 举报
回复
好久没有上来了,谢谢各位!我先看看帖子!
egyptcaesar 2005-03-16
  • 打赏
  • 举报
回复
不能用序列化,序列化后包含无用信息!应该使用非托管方式
参考,Structertoptr 和 ptrtoStructer函数
flyjiebing 2005-01-25
  • 打赏
  • 举报
回复
如果效率不是问题的话,何不用xml来交换数据?
FJGoodGood 2005-01-25
  • 打赏
  • 举报
回复
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());
}

}
Henry0 2005-01-25
  • 打赏
  • 举报
回复
那byte[]转换成struct如何做呢?

--->

那应该是自己手工拼凑了吧,你知道结构体的结构、成员,按顺序一个一个换好了,可以写个转换函数

struct mystruct change(byte[] b)
yanransoft 2005-01-25
  • 打赏
  • 举报
回复
mark
fengyecsdn 2005-01-22
  • 打赏
  • 举报
回复
上边说的差不多了
不过我只提醒一点!
一边用C++一边用C# 要注意结构内容的存放顺序问题。
如果不显式确定,而用内存快顺存放转换。两边的顺序是不同的
ET2004 2005-01-22
  • 打赏
  • 举报
回复
如果发送端和接收端都是 .NET 应用程序,用序列化比较方便,而且不用接触到 Marshal 或 unsafe 代码。虽然序列化的数据里会包含一些额外的数据,如:程序集名称、版本、公钥等,看似冗余,其实对版本控制是有好处的。

不过楼主已经说得很明白了,客户端是 C++,服务端是 C#,那用序列化就不是很现实了,除非是用 VC.NET 并使用托管代码,这样的情况可以参考这篇帖子:
http://community.csdn.net/Expert/topic/3466/3466293.xml?temp=.6052515

可以“比较”完美得实现 struct <-> byte[] 的互相转换。
webserv2 2005-01-21
  • 打赏
  • 举报
回复
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
FJGoodGood 2005-01-21
  • 打赏
  • 举报
回复
我明白楼主的意思了。
你可以尝试这样:

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());
}

}
SeeSunSet 2005-01-21
  • 打赏
  • 举报
回复
将结构体对象序列化成一个XML文件,然后传输后,在接收方再转换回来.
ET2004 2005-01-21
  • 打赏
  • 举报
回复
我也遇到跟楼主一样的问题,期待答案。
ET2004 2005-01-21
  • 打赏
  • 举报
回复
BinaryFormatter 序列化后的数据还是会包含额外信息,不仅仅是结构体的内容而已。
zlopen 2005-01-06
  • 打赏
  • 举报
回复
谁能给个具体的例子,我也碰到了相同的问题
Steven_luo 2005-01-06
  • 打赏
  • 举报
回复
我试试!谢谢你!
那byte[]转换成struct如何做呢?
Steven_luo 2005-01-06
  • 打赏
  • 举报
回复
楼下的,等你知道了一定要告诉我啊!
Ivony 2005-01-05
  • 打赏
  • 举报
回复
将你的结构体前面加上属性Serializable,然后用BinaryFormatter类序列化和反序列化。
Ivony 2005-01-05
  • 打赏
  • 举报
回复
序列化后传输。
兔子-顾问 2005-01-05
  • 打赏
  • 举报
回复
友情up

110,825

社区成员

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

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

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