对MemoryStream进行压缩、加密

在应用DeflateStream 或GZipStream进行压缩的时候,一定要先调用其实例的Close()方法,否则基流中的被压
缩的数据是不完整的,无法进行解压缩操作。这一点很重要!
       对内存流进行加密后应用基流这前一定要调用 CryptoStream 的 FlushFinalBlock 方法,否则无法解密!

     public   class  Serialize
    {
         //  用于初始化对称密钥
         private   static   byte [] key  =  {  1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 ,
            
7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
        };
        
private   static   byte [] IV  =  {  1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6  };


        
///   <summary>
        
///  将对象压缩加密到字节数据
        
///   </summary>
        
///   <param name="obj"> 要压缩加密的对象 </param>
        
///   <returns> 处理后生成的字节数组 </returns>
         public   static   byte [] CompressEncryptToBytes( object  obj)
        {
            
//  建立对称密码信息
            MemoryStream ms  =   new  MemoryStream();
            RijndaelManaged RM 
=   new  RijndaelManaged();
            CryptoStream EnCrpStrm 
=   new  CryptoStream(ms, RM.CreateEncryptor(key,IV), CryptoStreamMode.Write);
            DeflateStream zip 
=   new  DeflateStream(EnCrpStrm, CompressionMode.Compress,  true );
            
try
            {
                BinaryFormatter serializer 
=   new  BinaryFormatter();
                serializer.Serialize(zip, obj);
                zip.Close();        
//  在返回(return)这前一定要进行关闭
                EnCrpStrm.FlushFinalBlock();     //  在返回(return)这前一定要进行调用。
                 return  ms.ToArray();
            }
            
catch  (Exception e)
            {
                MsgBoxs.Alert(e.ToString());
                
return   null ;
            }
            
finally
            {
                EnCrpStrm.Close();
                ms.Close();
            }
        }

        
///   <summary>
        
///  将字节数组进行解密解压还原成对象
        
///   </summary>
        
///   <param name="ary"> 要处理的字节数组 </param>
        
///   <returns> 被还原的对象 </returns>
         public   static   object  DecompressDecryptToObject( byte [] ary)
        {
            MemoryStream ms 
=   new  MemoryStream(ary);
            RijndaelManaged RM 
=   new  RijndaelManaged();
            CryptoStream DeCrpStrm 
=   new  CryptoStream(ms, RM.CreateDecryptor(key, IV), CryptoStreamMode.Read);
            DeflateStream UnZip 
=   new  DeflateStream(DeCrpStrm, CompressionMode.Decompress);
            
try
            {
                BinaryFormatter serializer 
=   new  BinaryFormatter();
                
return  serializer.Deserialize(UnZip);
            }
            
catch  (Exception e)
            {
                MsgBoxs.Alert(e.ToString());
                
return   null ;
            }
            
finally
            {
                UnZip.Close();
                DeCrpStrm.Close();
                ms.Close();
            }
        }

        
///   <summary>
        
///  将对象压缩到字节数组
        
///   </summary>
        
///   <param name="obj"> 要压缩的对象 </param>
        
///   <returns> 压缩后的字节数组 </returns>
         public   static   byte [] CompressedToBytes( object  obj)
        {
            MemoryStream ms 
=   new  MemoryStream();
            DeflateStream zip 
=   new  DeflateStream(ms, CompressionMode.Compress,  true );
            
try
            {
                BinaryFormatter serializer 
=   new  BinaryFormatter();
                serializer.Serialize(zip, obj);
                zip.Close();
                
byte [] ary  =  ms.ToArray();
                ms.Close();
                
return  ary;
            }
            
catch  (Exception e)
            {
                zip.Close();
                ms.Close();
                MsgBoxs.Alert(e.ToString());
                
return   null ;
            }
        }

        /// <summary>
        /// 解压缩后对象
        /// </summary>
        /// <param name="ary">字节数组</param>
        /// <returns>对象</returns>
         public   static   object  DecompressToObject( byte [] ary)
        {
            MemoryStream ms 
=   new  MemoryStream(ary);
            DeflateStream UnZip 
=   new  DeflateStream(ms, CompressionMode.Decompress);
            
try
            {
                BinaryFormatter serializer 
=   new  BinaryFormatter();
                
object  obj  =  serializer.Deserialize(UnZip);
                UnZip.Close();
                ms.Close();
                
return  obj;
            }
            
catch  (Exception e)
            {
                UnZip.Close();
                ms.Close();
                MsgBoxs.Alert(e.ToString());
                
return   null ;
            }
        }
    }

你可能感兴趣的:(Stream)