/// <summary> /// 压缩发送数据 /// </summary> /// <param name="dataLength"></param> /// <param name="sendMarkData"></param> internal unsafe bool CompressSendData(int dataLength, ulong sendMarkData) { SubArray <byte> oldSendData = Data; if (AutoCSer.IO.Compression.DeflateCompressor.Get(Data.Array, Data.Start + (sizeof(uint) + sizeof(int)), dataLength, ref CompressBuffer, ref Data, sizeof(uint) + sizeof(int) * 2, sizeof(uint) + sizeof(int) * 2)) { int compressionDataSize = Data.Length; Data.MoveStart(-(sizeof(uint) + sizeof(int) * 2)); fixed(byte *sendDataFixed = Data.Array, oldSendDataFixed = oldSendData.Array) { byte *dataStart = sendDataFixed + Data.Start; *(int *)dataStart = *(int *)(oldSendDataFixed + oldSendData.Start); *(int *)(dataStart + sizeof(uint)) = -compressionDataSize; *(int *)(dataStart + (sizeof(uint) + sizeof(int))) = dataLength; if (sendMarkData != 0) { TcpServer.CommandBase.Mark32(dataStart + (sizeof(uint) + sizeof(int) * 2), sendMarkData, (compressionDataSize + 3) & (int.MaxValue - 3)); } } return(IsError = true); } return(false); }
/// <summary> /// 服务端数据结构定义数据 /// </summary> /// <param name="buffer">数据缓冲区</param> internal unsafe DataStructureBuffer(Buffer buffer) { Data = buffer.Array; fixed(byte *dataFixed = Data.Array) { byte *start = dataFixed + Data.Start, read = start + (OperationParameter.Serializer.HeaderSize + IndexIdentity.SerializeSize); Identity = new IndexIdentity(start + OperationParameter.Serializer.HeaderSize); CacheName = AutoCSer.BinarySerialize.DeSerializer.DeSerializeString(ref read, start + *(int *)start); Data.MoveStart((int)(read - start)); } }
/// <summary> /// 压缩发送数据 /// </summary> /// <param name="dataLength"></param> /// <param name="sendMarkData"></param> internal unsafe bool CompressSendData(int dataLength, ulong sendMarkData) { if (AutoCSer.IO.Compression.DeflateCompressor.Get(Data.Array, Data.Start + sizeof(int), dataLength, ref CompressBuffer, ref Data, sizeof(int) * 2, sizeof(int) * 2)) { int compressionDataSize = Data.Length; Data.MoveStart(-(sizeof(int) * 2)); fixed(byte *sendDataFixed = Data.GetFixedBuffer()) { byte *dataStart = sendDataFixed + Data.Start; *(int *)dataStart = -compressionDataSize; *(int *)(dataStart + sizeof(int)) = dataLength; if (sendMarkData != 0) { TcpServer.CommandBase.Mark64(dataStart + sizeof(int) * 2, sendMarkData, (compressionDataSize + 3) & (int.MaxValue - 3)); } } return(true); } return(false); }
/// <summary> /// 写入压缩数据 /// </summary> /// <param name="compressionData"></param> /// <param name="dataSize"></param> private void writeCompression(ref SubArray <byte> compressionData, int dataSize) { int compressionDataSize = -compressionData.Length; compressionData.MoveStart(-(sizeof(int) * 2)); fixed(byte *dataFixed = compressionData.Array) { byte *write = dataFixed + compressionData.Start; *(int *)write = compressionDataSize; *(int *)(write + sizeof(int)) = dataSize; } fileStream.Write(compressionData.Array, compressionData.Start, compressionData.Length); }
/// <summary> /// 写入压缩数据 /// </summary> /// <param name="compressionData"></param> /// <param name="bufferStart"></param> private void writeCompression(ref SubArray <byte> compressionData, byte *bufferStart) { int compressionDataSize = -compressionData.Length; compressionData.MoveStart(-(PacketHeaderSize + sizeof(int))); fixed(byte *dataFixed = compressionData.Array) { byte *write = dataFixed + compressionData.Start; *(int *)write = compressionDataSize; *(ulong *)(write + sizeof(int)) = *(ulong *)bufferStart; } dataFileStream.Write(compressionData.Array, compressionData.Start, compressionData.Length); dataFileLength += compressionData.Length; setIndex(); }
/// <summary> /// 压缩数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public static byte[] Compress(byte[] data) { SubBuffer.PoolBufferFull buffer = default(SubBuffer.PoolBufferFull); try { SubArray <byte> compressData = new SubArray <byte>(); if (DeflateCompressor.Get(data, 0, data.Length, ref buffer, ref compressData, sizeof(int), 0)) { compressData.MoveStart(-sizeof(int)); return(setSize(compressData.GetArray(), data.Length)); } byte[] newData = new byte[data.Length + sizeof(int)]; Buffer.BlockCopy(data, 0, newData, sizeof(int), data.Length); return(setSize(newData, data.Length)); } finally { buffer.TryFree(); } }