C++做了一个服务端Socket与C#客户端通信。
C# 接受的数据 无论怎么转码都是乱码。
(好久没上CSDN了,没多少分望见谅)
C# 接受的数据 无论怎么转码都是乱码。
(好久没上CSDN了,没多少分望见谅)
解决方案 »
- C#的一个模拟登陆的代码 实在不知道哪里错了 求大神解答
- 求助一个和窗体消息事件有关的问题
- 跟大佬们求个正则!
- 我想把 字符"CrystalDecisions.Shared.PaperSize.PaperA4" 转成对象 rystalDecisions.Shared.PaperSize.PaperA4,请帮忙
- 命名空间与exe的问题,急。。。
- 类中的静态字段的使用问题
- 请问使用zedgraph连接数据库显示图标的方法。(c#)
- c#怎样获得一个web请求的connect、send、wait、receive的时间
- C#中如何获取执行程序的当前路径?
- 送分:怎么样在输入时控制特殊字符的输入?比如单引号,双引号等,怎么样让输入框内只输入数字?
- 求份优雅的程序代码
- VS2012能不能在打开c#项目时选择使用.net framework 3.5呢?
是正确的C++GB2312,它传输的都是数字(写程序的人告诉我是传的结构里面没汉字)、
无语呀这个问题让我发现自己什么都不会了。目前下了一个SOCKET 工具 来检测C++发来的SOCKET 原样是什么。明天看一下吧--!
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;
}
//接受转换
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;
}