代码如下:
/* 用户登录请求信息 */ [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct LoginReq { [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_USER_NAME_LENGTH, ArraySubType = UnmanagedType.I4)] public char[] userName; //登录用户名 [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_PASSWORD_LENGTH, ArraySubType = UnmanagedType.I4)] public char[] passWord; //登录密码 } /* 将结构体转换成字节数组的封装函数 */ public static byte[] StructToBytes(object structObj) { //得到结构体的大小 int size = Marshal.SizeOf(structObj); byte[] bytes = new byte[size]; //分配结构体大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将结构体拷到分配好的内存空间 Marshal.StructureToPtr(structObj, structPtr, false); MyMsg.LoginReq loginReq = (MyMsg.LoginReq)Marshal.PtrToStructure(structPtr, typeof(MyMsg.LoginReq)); //从内存空间拷到byte数组 Marshal.Copy(structPtr, bytes, 0, size); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回byte数组 return bytes; }
structObj结构体传入的是LoginReq,它里面的值如截图所示:
但是将指针的内容转回相同的结构体时,发现里面的内容发生了改变,原先是0的地方,变成了一些乱码,如图所示:
本人是C#新手,没有学习过C#的知识,编程也是按照以前C的思路,遇到问题就百度,这个问题本人目前在网上还没有找到答案,所以请万能的论坛给小弟一个答案吧
解决方案
40
/* 将结构体转换成字节数组的封装函数 */
public static byte[] StructToBytes(object structObj)
{
LoginReq login = (LoginReq)structObj;
login.userName = (new string(login.userName)).PadRight(MAX_USER_NAME_LENGTH, “\0”).ToCharArray();
login.passWord = (new string(login.passWord)).PadRight(MAX_USER_NAME_LENGTH, “\0”).ToCharArray();
//得到结构体的大小
int size = Marshal.SizeOf(login);
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(login, structPtr, false);
LoginReq loginReq = (LoginReq)Marshal.PtrToStructure(structPtr, typeof(LoginReq));
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
public static byte[] StructToBytes(object structObj)
{
LoginReq login = (LoginReq)structObj;
login.userName = (new string(login.userName)).PadRight(MAX_USER_NAME_LENGTH, “\0”).ToCharArray();
login.passWord = (new string(login.passWord)).PadRight(MAX_USER_NAME_LENGTH, “\0”).ToCharArray();
//得到结构体的大小
int size = Marshal.SizeOf(login);
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(login, structPtr, false);
LoginReq loginReq = (LoginReq)Marshal.PtrToStructure(structPtr, typeof(LoginReq));
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}