C# 结构体 byte[]数组转换
问题是这样的,做一个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




