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

zhousq2008 zhousq2008 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码如下:

/* 用户登录请求信息 */
[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的思路,遇到问题就百度,这个问题我目前在网上还没有找到答案,所以请万能的论坛给小弟一个答案吧
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
zhousq2008
C# 111,128 成员 642,536 内容