请教,本人在使用C#中Marshal.StructureToPtr时,指针指向的内容和原来的内容不一致,求高手

.Net技术 码拜 8年前 (2016-03-08) 1479次浏览
代码如下:

/* 用户登录请求信息 */
[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,它里面的值如截图所示:
请教,本人在使用C#中Marshal.StructureToPtr时,指针指向的内容和原来的内容不一致,求高手
但是将指针的内容转回相同的结构体时,发现里面的内容发生了改变,原先是0的地方,变成了一些乱码,如图所示:
请教,本人在使用C#中Marshal.StructureToPtr时,指针指向的内容和原来的内容不一致,求高手
本人是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;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教,本人在使用C#中Marshal.StructureToPtr时,指针指向的内容和原来的内容不一致,求高手
喜欢 (0)
[1034331897@qq.com]
分享 (0)