⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cngpmessage.cs

📁 网通网关Cngp
💻 CS
字号:
using System;
using System.Text;
using System.Collections;
using System.Security.Cryptography;
using Pierce.MyIPAddress;
using System.Net;
namespace Cngp
{
	/// <summary>
	/// CngpMessage 的摘要说明。
	/// </summary>
	public class CngpMessage
	{
		private MyIPAddress ipAddress=new MyIPAddress();
		public CngpMessage()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		/// <summary>
		/// 信息格式
		/// </summary>
		public enum Character:byte
		{
			ASCII=0,Reserve=3,Bin=4,UCS2=8,GB=15
		}
		/// <summary>
		/// 命令标示
		/// </summary>
		public enum Command_Id:uint
		{
			login=0x00000001,
			login_resp=0x80000001,
			submit=0x00000002,
			submit_resp=0x80000002,
			deliver=0x00000003,
			deliver_resp=0x80000003,
			active_test=0x00000004,
			active_test_resp=0x80000004,
			exit=0x00000006,
			exit_resp=0x80000006
		}
		/// <summary>
		/// 用字节填充字节数组,
		/// 位于特定位置字节
		/// </summary>
		/// <param name="buffer">目的字节数组</param>
		/// <param name="location">游标变量</param>
		/// <param name="byt">源字节</param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,byte SourceByte)
		{
			Buffer.SetByte(DestByte,Location,SourceByte);
			Location++;
		}
		/// <summary>
		/// 用字节数组填充目的数组,
		/// 位于特定位置
		/// </summary>
		/// <param name="DestByte">目标数组</param>
		/// <param name="Location">位移变量</param>
		/// <param name="SourceByte">源数组</param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,byte[] SourceByte)
		{
			AddToBuffer(ref DestByte,ref Location,SourceByte,(int)SourceByte.Length);
		}
		/// <summary>
		/// 用定长的数组填充目的数组
		/// </summary>
		/// <param name="DestByte"></param>
		/// <param name="Location"></param>
		/// <param name="SourceByte"></param>
		/// <param name="Size"></param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,byte[] SourceByte,int Size)
		{
			Buffer.BlockCopy(SourceByte,0,DestByte,Location,Size);
			Location=Location+Size;
		}
		/// <summary>
		/// 用uint的整数填充数组,
		/// 位于特定位置
		/// </summary>
		/// <param name="DestByte"></param>
		/// <param name="Location"></param>
		/// <param name="Number"></param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,uint Number)
		{
			//转换字节顺序
			Number=ipAddress.HostToNetworkOrder(Number);
			//填充
			AddToBuffer(ref DestByte,ref Location,BitConverter.GetBytes(Number));
		}
		/// <summary>
		/// 用int的整数填充数组
		/// </summary>
		/// <param name="DestBtye"></param>
		/// <param name="Location"></param>
		/// <param name="Number"></param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,int Number)
		{
			Number=IPAddress.HostToNetworkOrder(Number);
			AddToBuffer(ref DestByte,ref Location,BitConverter.GetBytes(Number));
		}
		/// <summary>
		/// 用定长字符填充
		/// </summary>
		/// <param name="DestByte"></param>
		/// <param name="Location"></param>
		/// <param name="Message"></param>
		/// <param name="Size"></param>
		/// <param name="character"></param>
		public void AddToBuffer(ref byte[] DestByte,ref int Location,string Message,int Size,Character character)
		{
			byte[] MessageByte=null;
			//字符长度,	字符转换为数组
			int Length=GetStringLength(Message,character,ref MessageByte);
		
			
			//判断
			if(Length<Size)//字符长度小于Size
			{
				//定长数组
				byte[] ByteTotal=new Byte[Size];
				
				//将字符数组中的信息复制到定长数组
				Array.Copy(MessageByte,0,ByteTotal,0,Length);
				//将定长数组复制到给定数组
				AddToBuffer(ref DestByte,ref Location,ByteTotal);
				
			}
			else//字符长度大于,等于Size
			{
				AddToBuffer(ref DestByte,ref Location,MessageByte,Size);
			}
			
		}
		/// <summary>
		/// 获取字符串长度
		/// </summary>
		/// <param name="Message">字符</param>
		/// <param name="character" >枚举字符类型</param>
		/// <returns>返回字符串长度</returns>
		public int GetStringLength(string Message,Character character,ref byte[] bs)
		{
			int Size=0;
			
			if(Message==null)
			{
				Size=0;
			}
			else
			{
				switch(character)
				{
					case(Character.ASCII):
						//字符串转换为字节数组
						bs=Encoding.ASCII.GetBytes(Message);
						break;
					case(Character.GB):
						bs=Encoding.GetEncoding("GB2312").GetBytes(Message);
						break;				
					

				}
				Size=(int)bs.Length;
			}
			return Size;
		}

		/// <summary>
		/// 封包过程,
		/// 加入包头,包体
		/// </summary>
		/// <param name="CommandId">命令或者相应类型</param>
		/// <param name="SequenceId">流水序号</param>
		/// <param name="Command_Status" >命令状态</param>
		/// <param name="MessageBody">包体</param>
		/// <param name="Message">包</param>
		public void Pack(uint CommandId,uint Command_Status,uint SequenceId,byte[] MessageBody,ref byte[] Message)
		{
			//位移变量
			int i=0;
			//总长度
			uint TotalLength=16+(uint)MessageBody.Length;
			Message=new byte[TotalLength];
			//封包,包头
			AddToBuffer(ref Message,ref i,TotalLength);//加入总长度			
			AddToBuffer(ref Message,ref i,CommandId);//加入commandId	
			AddToBuffer(ref Message,ref i,Command_Status);//status
			AddToBuffer(ref Message,ref i,SequenceId);//加入序号
			
			//加入包体
			AddToBuffer(ref Message,ref i,MessageBody);

		}

		/// <summary>
		/// 解包
		/// </summary>
		/// <param name="CommandId">commandId</param>
		/// <param name="SequenceId">sequence</param>
		/// <param name="Command_Status" >命令状态</param>
		/// <param name="MessageBody">包体</param>
		/// <param name="Message">包</param>
		public void UnPack(uint Length,ref uint CommandId,ref uint Command_Status,ref uint SequenceId,ref byte[] MessageBody,byte[] PartMessage)
		{
			//位移变量
			int i=0;			
			//包体
			MessageBody=new byte[Length-16];
			//commandId
			CommandId=ipAddress.NetworkToHostOrder(BitConverter.ToUInt32(PartMessage,i));
			i+=4;
			//command_status
			Command_Status=ipAddress.NetworkToHostOrder(BitConverter.ToUInt32(PartMessage,i));
			i+=4;
			//sequence
			SequenceId=ipAddress.NetworkToHostOrder(BitConverter.ToUInt32(PartMessage,i));
			i+=4;
			//包体,游标加4,即从12开始
			Array.Copy(PartMessage,i,MessageBody,0,Length-16);
			
		}
		/// <summary>
		/// 将字节数组用md5加密,
		/// 返回加密数组,长度16位
		/// </summary>
		/// <param name="Data"></param>
		/// <returns></returns>
		public byte[] MD5CryptoGraphy(byte[] Data)
		{
			return new MD5CryptoServiceProvider().ComputeHash(Data);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -