求教,我在使用C#中Marshal.StructureToPtr时,指针指向的内容和原来的内容不一致,求高手解答
代码如下:
structObj结构体传入的是LoginReq,它里面的值如截图所示:

但是将指针的内容转回相同的结构体时,发现里面的内容发生了改变,原先是0的地方,变成了一些乱码,如图所示:

我是C#新手,没有学习过C#的知识,编程也是按照以前C的思路,遇到问题就百度,这个问题我目前在网上还没有找到答案,所以请万能的论坛给小弟一个答案吧
/* 用户登录请求信息 */
[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的思路,遇到问题就百度,这个问题我目前在网上还没有找到答案,所以请万能的论坛给小弟一个答案吧
...全文
相关推荐
C#结构体指针的定义及使用详解
C#结构体指针的定义及使用详解
C#—EMguCV Marshal
将数据从托管对象封送到非托管内存块,属于.NET Framework 类库
Marshal类的使用
Marshal类的简单使用,博客:http://blog.csdn.net/dingxiaowei2013/article/details/23934693
C#结构体和C++字节数组的转换
在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按此方法实现。
C#中结构体struct和字节数组Byte的之间的转换函数
在tcp通讯的时候经常会遇到 struct传输的情况。但是C#中tcp只能传送byte[]类型,于是struct与byte相互转化就成为了一个麻烦的事情,这里提供两个方法。


