Esempio n. 1
0
        /// <summary>
        /// 压缩数据
        /// </summary>
        /// <param name="data">原始数据</param>
        /// <param name="startIndex">起始位置</param>
        /// <param name="count">压缩字节数</param>
        /// <param name="seek">起始位置</param>
        /// <param name="memoryPool">数据缓冲区内存池</param>
        /// <returns>压缩后的数据,失败返回null</returns>
        internal subArray <byte> GetCompressUnsafe(byte[] data, int startIndex, int count, int seek = 0, memoryPool memoryPool = null)
        {
            int length = count + seek;

            if (memoryPool == null)
            {
                using (MemoryStream dataStream = new MemoryStream())
                {
                    if (seek != 0)
                    {
                        dataStream.Seek(seek, SeekOrigin.Begin);
                    }
                    using (Stream compressStream = getStream(dataStream))
                    {
                        compressStream.Write(data, startIndex, count);
                    }
                    if (dataStream.Position < length)
                    {
                        return(subArray <byte> .Unsafe(dataStream.GetBuffer(), seek, (int)dataStream.Position - seek));
                    }
                }
            }
            else
            {
                byte[] buffer = memoryPool.Get();
                try
                {
                    using (MemoryStream dataStream = memoryStream.UnsafeNew(buffer))
                    {
                        if (seek != 0)
                        {
                            dataStream.Seek(seek, SeekOrigin.Begin);
                        }
                        using (Stream compressStream = getStream(dataStream))
                        {
                            compressStream.Write(data, startIndex, count);
                        }
                        if (dataStream.Position < length)
                        {
                            byte[] streamBuffer = dataStream.GetBuffer();
                            if (streamBuffer == buffer)
                            {
                                buffer = null;
                            }
                            return(subArray <byte> .Unsafe(streamBuffer, seek, (int)dataStream.Position - seek));
                        }
                    }
                }
                catch (Exception error)
                {
                    log.Error.Add(error, null, false);
                }
                finally
                {
                    memoryPool.PushOnly(buffer);
                }
            }
            return(default(subArray <byte>));
        }
Esempio n. 2
0
 /// <summary>
 /// 获取缩略图
 /// </summary>
 /// <param name="data">输出数据</param>
 /// <param name="width">缩略宽度</param>
 /// <param name="height">缩略高度</param>
 /// <param name="type">目标图像文件格式</param>
 /// <param name="backColor">背景色</param>
 /// <param name="memoryPool">输出数据缓冲区内存池</param>
 /// <param name="seek">输出数据起始位置</param>
 public void Pad(ref subArray <byte> data, ref int width, ref int height, ImageFormat type, Color backColor, memoryPool memoryPool, int seek)
 {
     if (checkPad(ref width, ref height))
     {
         if (memoryPool == null)
         {
             using (MemoryStream stream = new MemoryStream())
             {
                 if (seek != 0)
                 {
                     stream.Seek(seek, SeekOrigin.Begin);
                 }
                 pad(stream, width, height, type, backColor);
                 data.UnsafeSet(stream.GetBuffer(), seek, (int)stream.Position - seek);
                 return;
             }
         }
         byte[] buffer = memoryPool.Get();
         try
         {
             using (MemoryStream stream = memoryStream.UnsafeNew(buffer))
             {
                 if (seek != 0)
                 {
                     stream.Seek(seek, SeekOrigin.Begin);
                 }
                 pad(stream, width, height, type, backColor);
                 byte[] bufferData = stream.GetBuffer();
                 if (buffer == bufferData)
                 {
                     buffer = null;
                     //showjim
                     if ((int)stream.Position > bufferData.Length)
                     {
                         log.Error.Add("Position " + ((int)stream.Position).toString() + " > " + bufferData.Length.toString(), null, false);
                     }
                 }
                 data.UnsafeSet(bufferData, seek, (int)stream.Position - seek);
                 return;
             }
         }
         finally { memoryPool.PushOnly(buffer); }
     }
     data.Null();
 }
Esempio n. 3
0
 /// <summary>
 /// 获取解压数据
 /// </summary>
 /// <returns>解压数据</returns>
 public unsafe subArray <byte> Get(memoryPool memoryPool)
 {
     if (memoryPool == null)
     {
         pointer data = fastCSharp.unmanagedPool.StreamBuffers.Get();
         try
         {
             using (dataStream = new unmanagedStream(data.Byte, fastCSharp.unmanagedPool.StreamBuffers.Size))
             {
                 get();
                 return(new subArray <byte>(dataStream.GetArray()));
             }
         }
         finally { fastCSharp.unmanagedPool.StreamBuffers.Push(ref data); }
     }
     else
     {
         byte[] data = memoryPool.Get();
         try
         {
             fixed(byte *dataFixed = data)
             {
                 using (dataStream = new unmanagedStream(dataFixed, data.Length))
                 {
                     get();
                     if (dataStream.data.data == dataFixed)
                     {
                         byte[] buffer = data;
                         data = null;
                         return(subArray <byte> .Unsafe(buffer, 0, dataStream.Length));
                     }
                     return(new subArray <byte>(dataStream.GetArray()));
                 }
             }
         }
         finally { memoryPool.PushOnly(data); }
     }
 }