求教C#和C++的socket通讯中结构体中存在字符串的问题
这个是我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#的char是两个字节的