C++做了一个服务端Socket与C#客户端通信。
C# 接受的数据 无论怎么转码都是乱码。
(好久没上CSDN了,没多少分望见谅)

解决方案 »

  1.   

    C++ SOCKET 传的数据是个结构体,没面没有汉字字符 都是数字
      

  2.   


    是正确的C++GB2312,它传输的都是数字(写程序的人告诉我是传的结构里面没汉字)、
    无语呀这个问题让我发现自己什么都不会了。目前下了一个SOCKET 工具 来检测C++发来的SOCKET 原样是什么。明天看一下吧--!
      

  3.   

    问题解决了,搜的资料。与大家分享下吧1·知道SOCKET 传的结构体 是什么样的,用C# 模仿写一个
    2·接收SOCKET 后将字节数据转换成结构
     /// <summary>
            /// byte数组转结构
            /// </summary>
            /// <param name="bytes">byte数组</param>
            /// <param name="type">结构类型</param>
            /// <returns>转换后的结构</returns>
            public object BytesToStruct(byte[] bytes, Type type)
            {
                //得到结构的大小
                int size = Marshal.SizeOf(type);
                //Byte数组长度小于结构的大小
                if (size > bytes.Length)
                {
                    //返回空
                    return null;
                }
                //分配节构大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                //将byte数据拷贝到分配好的内存空间
                Marshal.Copy(bytes, 0, structPtr, size);
                //将内存空间转换为目标结构
                object obj = Marshal.PtrToStructure(structPtr, type);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                //返回结构体
                return obj;
            }
      

  4.   

    socket通信需要做转换~~
    //接受转换
    IPAddress.NetworkToHostOrder(参数);
    //发送转换
    IPAddress.HostToNetworkOrder(参数);//结果转化为字节
            internal static unsafe byte[] xamStructToBytesB<T>(T s)
            {
                int size = Marshal.SizeOf(s);
                System.IntPtr ptr = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(s, ptr, true);
                byte[] ba = new byte[size];
                Marshal.Copy(ptr, ba, 0, ba.Length);
                return ba;
            }        //字节转化为结构
            internal static unsafe T xamBytesToStructB<T>(byte[] arr) where T : new()
            {
                T struReturn = new T();
                int size = Marshal.SizeOf(struReturn);
                System.IntPtr ptr = Marshal.AllocHGlobal(size);
                Marshal.Copy(arr, 0, ptr, arr.Length);
                struReturn = (T)Marshal.PtrToStructure(ptr, struReturn.GetType());
                return struReturn;
            }
    在给个C#中结构定义[StructLayout(LayoutKind.Sequential, Pack = 1)]
            private struct struct_AlarmReq
            {
                internal MsgHead head;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                internal byte[] appSID;
                internal int ctrlBit;   //0:获取指定网关上指定设备的状态信息 1:获取网关上所有设备的状态信息
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                internal byte[] gateID;
                internal int devNum;
                internal struct_ID[] IDs;
            }