예제 #1
0
        /// <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));
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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();
        }
예제 #6
0
 /// <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(); }
 }