日期:2014-05-17  浏览次数:20875 次

求教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# C++ socket

------解决方案--------------------
C#的char是两个字节的


引用:
Quote: 引用:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string psw;
这种方式就可以,gb2312的可以解析出来

Quote: 引用:

Quote: 引用:

代码基本上是对的,结果也对
结果不对啊,char数组一直取不到值。不过byte数组我又测试了下,psw是能取到的
我把psw字段改成byte[]就可以正确的取出来了,为啥char[]就是不行呢??