[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Head
{
public ushort proMagic; //包起始标记:固定0x7e7e
public ushort proPackLen; //包长度:包头 + 数据区 + 包尾长度,注意不要超过最大长度限制
public long proSrcAddr; //源地址:不使用,填0
public ushort proSrcPort; //源地址端口:不使用,填0
public long proDstAddr; //目的地址:不使用,填0
public ushort proDstPort; //目的端口:不使用,填0
public ushort proCmdCode; //命令码:参见以上命令码定义
public ushort proVersion; //版本号:不使用,填1
public char proSerial; //报文序号:一条报文实例对应一个序号,不同报文叠加,0-255往复
public ushort proPackSum; //总包数:当包长超过最大长度限制时,需要拆包,大包拆小包总数,不拆默认1
public ushort proPackId; //当前包号:对应以上总包数的小包标识,不拆默认0
}
/// <summary>
/// 终端信息查询
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct PackTerminalSearch5001
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
/// <summary>
/// 终端编号
/// </summary>
public string stationCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
/// <summary>
/// 回复指令
/// </summary>
public Byte[] order;
}
/// <summary>
/// 终端信息数据
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct PackTerminalSearch3004
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
/// <summary>
/// 终端编号
/// </summary>
public string stationCode;
/// <summary>
/// 终端IP
/// </summary>
public long terminalIP;
/// <summary>
/// 终端端口
/// </summary>
public ushort terminalPort;
/// <summary>
/// 中心IP
/// </summary>
public long serverIP;
/// <summary>
/// 测站端口
/// </summary>
public ushort serverPort;
/// <summary>
/// 磁盘信息数组
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public PackDiskInfo[] diskInfoArray;
}
/// <summary>
/// 磁盘信息
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct PackDiskInfo
{
/// <summary>
/// 盘符
/// </summary>
public char drive;
/// <summary>
/// 总空间
/// </summary>
public double totalSize;
/// <summary>
/// 可用空间
/// </summary>
public double usableSize;
}
PackTerminalSearch5001 info;
info.stationCode = "12345";
info.order = new byte[6] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
Byte[] recv = StructToBytes(info);
object obj = BytesToStuct(recv, typeof(PackTerminalSearch5001));
PackTerminalSearch5001 info5001 = (PackTerminalSearch5001)obj;
byte[] order = info5001.order;
//// <summary>
/// 结构体转byte数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
public static byte[] StructToBytes(object structObj)
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}
/// <summary>
/// byte数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
public static object BytesToStuct(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;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有