using System; using System.Buffers; using System.Net.Sockets; namespace HaoYueNet.ClientNetwork { public static class BytesArrayPool { public static byte[] RentBuffer(int minSize) { return ArrayPool.Shared.Rent(minSize); } public static void ReturnBuffer(byte[] buffer) { ArrayPool.Shared.Return(buffer); } } public static class BaseData { #if NETSTANDARD2_0_OR_GREATER static class BitConverter { /// /// 将short值以小端序写入字节数组 /// /// 目标字节数组 /// 要写入的short值 /// 写入起始位置 public static void TryWriteBytes(byte[] buffer, short value, int offset = 0) { // 小端序:低位在前,高位在后 buffer[offset] = (byte)value; // 低位字节 buffer[offset + 1] = (byte)(value >> 8); // 高位字节 } /// /// 将ushort值以小端序写入字节数组 /// public static void TryWriteBytes(byte[] buffer, ushort value, int offset = 0) { buffer[offset] = (byte)value; // 低位字节 buffer[offset + 1] = (byte)(value >> 8); // 高位字节 } /// /// 将uint值以小端序写入字节数组 /// public static void TryWriteBytes(byte[] buffer, uint value, int offset = 0) { buffer[offset] = (byte)value; // 字节0 (最低位) buffer[offset + 1] = (byte)(value >> 8); // 字节1 buffer[offset + 2] = (byte)(value >> 16); // 字节2 buffer[offset + 3] = (byte)(value >> 24); // 字节3 (最高位) } /// /// 将int值以小端序写入字节数组 /// public static void TryWriteBytes(byte[] buffer, int value, int offset = 0) { buffer[offset] = (byte)value; // 字节0 (最低位) buffer[offset + 1] = (byte)(value >> 8); // 字节1 buffer[offset + 2] = (byte)(value >> 16); // 字节2 buffer[offset + 3] = (byte)(value >> 24); // 字节3 (最高位) } public static ushort ToUInt16(Span span) { return System.BitConverter.ToUInt16(span.ToArray(), 0); } } #endif /// /// 心跳包数据 /// public static byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; public static class HunterNet_Heartbeat { public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs) { myreadEventArgs.SetBuffer(HeartbeatData, 0, HeartbeatData.Length); } } public static class HunterNet_S2C { const int LenghtDataLength = sizeof(UInt32); const int CmdDataLength = sizeof(UInt16); const int ErrDataLength = sizeof(UInt16); public static int GetAllLength(byte[] bodyData) { return CmdDataLength + ErrDataLength + LenghtDataLength + bodyData.Length; } public static int GetBodyLength(byte[] allData) { return allData.Length - CmdDataLength - ErrDataLength; } public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data) { int allDataLength = GetAllLength(AddonBytes_Data); byte[] finalData = BytesArrayPool.RentBuffer(allDataLength); CreatePkgData(CmdID, Error, AddonBytes_Data, ref finalData, out int usefulLenght); myreadEventArgs.SetBuffer(finalData, 0, usefulLenght); BytesArrayPool.ReturnBuffer(finalData); //myreadEventArgs.SetBuffer(CreatePkgData(CmdID, Error, AddonBytes_Data)); } public static void CreatePkgData(UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data, ref byte[] finalData, out int usefulLenght) { int allLength = GetAllLength(AddonBytes_Data); byte[] bytes_allLenght = BytesArrayPool.RentBuffer(LenghtDataLength); BitConverter.TryWriteBytes(bytes_allLenght, allLength);//包长度 byte[] bytes_cmdid = BytesArrayPool.RentBuffer(CmdDataLength); BitConverter.TryWriteBytes(bytes_cmdid, CmdID); byte[] bytes_errid = BytesArrayPool.RentBuffer(ErrDataLength); BitConverter.TryWriteBytes(bytes_errid, Error); Buffer.BlockCopy(bytes_allLenght, 0, finalData, 0, LenghtDataLength); //CMDID Buffer.BlockCopy(bytes_cmdid, 0, finalData, LenghtDataLength, CmdDataLength); //ErrID Buffer.BlockCopy(bytes_errid, 0, finalData, LenghtDataLength + CmdDataLength, ErrDataLength); //DATA Buffer.BlockCopy(AddonBytes_Data, 0, finalData, LenghtDataLength + CmdDataLength + ErrDataLength, AddonBytes_Data.Length); BytesArrayPool.ReturnBuffer(bytes_allLenght); BytesArrayPool.ReturnBuffer(bytes_cmdid); BytesArrayPool.ReturnBuffer(bytes_errid); usefulLenght = allLength; /* //包长度 int AllLenght = 4 + 2 + 2 + AddonBytes_Data.Length; byte[] BufferData = new byte[AllLenght]; //包长度 Buffer.BlockCopy(BitConverter.GetBytes(AllLenght), 0, BufferData, 0, sizeof(int)); //CMDID Buffer.BlockCopy(BitConverter.GetBytes(CmdID), 0, BufferData, 4, sizeof(UInt16)); //ErrID Buffer.BlockCopy(BitConverter.GetBytes(Error), 0, BufferData, 4 + 2, sizeof(UInt16)); //DATA Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, 4 + 2 + 2, AddonBytes_Data.Length); return BufferData;*/ } public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out UInt16 Error, out byte[] data) { CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); Error = BitConverter.ToUInt16(srcdata.Slice(2, 2)); data = srcdata.Slice(2 + 2).ToArray(); } } public static class HunterNet_C2S { const int LenghtDataLength = sizeof(UInt32); const int CmdDataLength = sizeof(UInt16); public static int GetAllLengthByBody(byte[] bodyData) { return LenghtDataLength + CmdDataLength + bodyData.Length; } public static int GetAllLengthByUsedLen(int UsedLength) { return LenghtDataLength + CmdDataLength + UsedLength; } public static int GetBodyLength(byte[] allData) { return allData.Length - CmdDataLength; } public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, byte[] AddonBytes_Data) { int allDataLength = GetAllLengthByBody(AddonBytes_Data); byte[] finalData = BytesArrayPool.RentBuffer(allDataLength); CreatePkgData(CmdID, AddonBytes_Data, ref finalData, out int usefulLenght); myreadEventArgs.SetBuffer(finalData, 0, usefulLenght); BytesArrayPool.ReturnBuffer(finalData); //myreadEventArgs.SetBuffer(CreatePkgData(CmdID, AddonBytes_Data)); } public static void CreatePkgData(UInt16 CmdID, byte[] bytesdata, ref byte[] finalData, out int usefulLenght) { CreatePkgData(CmdID, bytesdata, bytesdata.Length, ref finalData, out usefulLenght); } public static void CreatePkgData(UInt16 CmdID, byte[] bytesdata,int bytesdata_useLenght, ref byte[] finalData, out int usefulLenght) { int allLength = GetAllLengthByUsedLen(bytesdata_useLenght); byte[] bytes_allLenght = BytesArrayPool.RentBuffer(LenghtDataLength); BitConverter.TryWriteBytes(bytes_allLenght, allLength); byte[] bytes_cmdid = BytesArrayPool.RentBuffer(CmdDataLength); BitConverter.TryWriteBytes(bytes_cmdid, CmdID); //包长度 Buffer.BlockCopy(bytes_allLenght, 0, finalData, 0, LenghtDataLength); //CMDID Buffer.BlockCopy(bytes_cmdid, 0, finalData, LenghtDataLength, CmdDataLength); //DATA Buffer.BlockCopy(bytesdata, 0, finalData, LenghtDataLength + CmdDataLength, bytesdata_useLenght); BytesArrayPool.ReturnBuffer(bytes_allLenght); BytesArrayPool.ReturnBuffer(bytes_cmdid); usefulLenght = allLength; /* byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Data.Length + 4; //包长度 byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); byte[] BufferData = new byte[AllLenght]; //包长度 Buffer.BlockCopy(AddonBytes_Lenght, 0, BufferData, 0, AddonBytes_Lenght.Length); //CMDID Buffer.BlockCopy(AddonBytes_CmdID, 0, BufferData, 4, AddonBytes_CmdID.Length); //DATA Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, 4 + 2, AddonBytes_Data.Length); return BufferData;*/ } public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out byte[] data) { CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); data = srcdata.Slice(2).ToArray(); } } } }