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

zhousq2008 2015-01-24 01:32:13
代码如下:

/* 用户登录请求信息 */
[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的思路,遇到问题就百度,这个问题我目前在网上还没有找到答案,所以请万能的论坛给小弟一个答案吧
...全文
513 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_18459439 2016-05-27
  • 打赏
  • 举报
回复
楼主不带结贴的吗?
qq_18459439 2016-05-27
  • 打赏
  • 举报
回复
请问这个问题解决了吗
  • 打赏
  • 举报
回复
/* 将结构体转换成字节数组的封装函数 */ 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; }
  • 打赏
  • 举报
回复
目测,你是想在托管代码回去 string类型的 userName 和 passWord 转换成 非托管的 char * 类型, 你可以尝试使用: string userName; string passWord; // etc 获取 userName,passWord的值! IntPtr ptrUserName=Marshal.StringToHGlobalAnsi("userName"); IntPtr ptrPassWord=Marshal.StringToHGlobalAnsi("passWord"); // etc 传给非托管代码 ptrUserName,ptrPassWord。
zhousq2008 2015-01-24
  • 打赏
  • 举报
回复
先顶一个,坐等C#专家出现

110,534

社区成员

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

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

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