📄 cngpmessage.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 + -