111,126
社区成员
发帖
与我相关
我的任务
分享
namespace GameData
{
[StructLayout(LayoutKind.Sequential, Pack = 1,CharSet = CharSet.Unicode), Serializable]
public struct Loginmsg
{
public byte datatypes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
public string userid;
}
}
客户端发送部分代码
if(message[0]==1)
{
Loginmsg msg=new Loginmsg();
msg.datatype=1;
msg.userid="我爱你";
byte[] bytes=Tool.StructToBytes(msg);
BinaryWriter bw = new BinaryWriter(networkStream);
short count = (short)bytes.Length;
bw.Write(count);
bw.Write(bytes);
bw.Flush();
}
服务端接收部分代码
if (receiveMessage[0] == 1)
{
Loginmsg ms = new Loginmsg();
ms = (Loginmsg)Tool.BytesToStruct(receiveMessage, ms.GetType());
Console.WriteLine(ms.userid);
}
Tool工具代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
namespace GameData
{
public class Tool
{
public static byte[] StructToBytes(object obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
IntPtr structPtr = Marshal.AllocHGlobal(size); //分配结构体大小的内存空间
Marshal.StructureToPtr(obj, structPtr, false); //将结构体拷到分配好的内存空间
Marshal.Copy(structPtr, bytes, 0, size); //从内存空间拷到byte数组
Marshal.FreeHGlobal(structPtr); //释放内存空间
return bytes;
}
public static object BytesToStruct(byte[] bytes, Type type)
{
int size = Marshal.SizeOf(type);
if (size > bytes.Length)
return null;
IntPtr structPtr = Marshal.AllocHGlobal(size); //分配结构大小的内存空间
Marshal.Copy(bytes, 0, structPtr, size); //将byte数组拷到分配好的内存空间
object obj = Marshal.PtrToStructure(structPtr, type);
Marshal.FreeHGlobal(structPtr);
return obj;
}
}
}
Loginmsg msg = new Loginmsg();
msg.datatypes = 1;
msg.userid = "我爱你";
byte[] bytes = Tool.StructToBytes(msg); //bytes长度35字节
MemoryStream networkStream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(networkStream);
short count = (short)bytes.Length;
bw.Write(count);
bw.Write(bytes);
bw.Flush();
//这里说明一下,如果直接传给服务端bytes是没有问题的,但是如果用MemoryStream传递,就需要先转为字节数组
bytes = new byte[networkStream.Length];//此时长度为37,不是35了
networkStream.Read(bytes, 0, bytes.Length);
Loginmsg ms = new Loginmsg();
ms = (Loginmsg)Tool.BytesToStruct(bytes, ms.GetType());//这里返回结果异常