这个是我C#结构体
//结构体序列化
[System.Serializable]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
public struct LoginError
{
public uint id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string psw;
public uint num;
}
这个是C++结构体
struct
{
DWORD ID;
CHAR PSW[32];
DWORD NUM;
}
C++往C#端发送,这个是转换的函数:
//字节数组转结构体
public static object BytesToStruct(byte[] bytes, Type strcutType)
{
//得到结构体的大小
int size = Marshal.SizeOf(strcutType);
byte[] newBytes = new byte[size];
int length = bytes.Length>size?size:bytes.Length;
Array.Copy(bytes,newBytes,length);
//分配结构体大小的内存空间
IntPtr buffer = Marshal.AllocHGlobal(length);
//将byte数组拷到分配好的内存空间
Marshal.Copy(newBytes,0,buffer,length);
//将内存空间转换为目标结构体
object structObj = Marshal.PtrToStructure(buffer,strcutType);
Marshal.FreeHGlobal(buffer);
//释放内存空间
return structObj;
}
请问:
1、为什么我取出来的psw始终是null,如果我换成char[],上面也写成UnmanagedType.ByValArray,依然是{'0','0'......},或者我再用byte[],里面的值还是{0,0,0......}
2、C++里面编码好像是gb2312,我的开发环境是MonoDevelop+Mac OS下面的,如果上面能取出值那我还需要再转码么?(如果我拷贝一串字节数组,然后nickName = Encoding.GetEncoding("gb2312").GetString(userNameBytes);是可以得到正确的中文的)C#C++socket
//结构体序列化
[System.Serializable]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
public struct LoginError
{
public uint id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string psw;
public uint num;
}
这个是C++结构体
struct
{
DWORD ID;
CHAR PSW[32];
DWORD NUM;
}
C++往C#端发送,这个是转换的函数:
//字节数组转结构体
public static object BytesToStruct(byte[] bytes, Type strcutType)
{
//得到结构体的大小
int size = Marshal.SizeOf(strcutType);
byte[] newBytes = new byte[size];
int length = bytes.Length>size?size:bytes.Length;
Array.Copy(bytes,newBytes,length);
//分配结构体大小的内存空间
IntPtr buffer = Marshal.AllocHGlobal(length);
//将byte数组拷到分配好的内存空间
Marshal.Copy(newBytes,0,buffer,length);
//将内存空间转换为目标结构体
object structObj = Marshal.PtrToStructure(buffer,strcutType);
Marshal.FreeHGlobal(buffer);
//释放内存空间
return structObj;
}
请问:
1、为什么我取出来的psw始终是null,如果我换成char[],上面也写成UnmanagedType.ByValArray,依然是{'0','0'......},或者我再用byte[],里面的值还是{0,0,0......}
2、C++里面编码好像是gb2312,我的开发环境是MonoDevelop+Mac OS下面的,如果上面能取出值那我还需要再转码么?(如果我拷贝一串字节数组,然后nickName = Encoding.GetEncoding("gb2312").GetString(userNameBytes);是可以得到正确的中文的)C#C++socket
结构里有整数,你确定一下Mac OS下的字节序,不过两端都在同一平台下也无所谓
public string psw;
这种方式就可以,gb2312的可以解析出来结果不对啊,char数组一直取不到值。不过byte数组我又测试了下,psw是能取到的
结果不对啊,char数组一直取不到值。不过byte数组我又测试了下,psw是能取到的我把psw字段改成byte[]就可以正确的取出来了,为啥char[]就是不行呢??
你把byte[]转为struct,用char[]对应byte[]倒是也行,也能接收。
但是在你把Struct转为IntPtr时,就不一样了。Char[]的字段,指定了SizeConst,那么Char[]的长度和字节数都是SizeConst值,这在Char[]里只有ASCII码字符时也没问题,但是如果Char[]里有汉字时,就不对了。
用char数组。