⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bzip2.cpp

📁 含有多种公开密钥算法、多种块加密、多种数据流加密、多种HASH函数、多种CheckSum校验、多种MAC校验等几十种加密算法的程序
💻 CPP
字号:
/************************************************** Bzip Compressor Source File                    ** (C) 1999-2002 The Botan Project                **************************************************/#include <botan/bzip2.h>#include <cstring>#define BZ_NO_STDIO#include <bzlib.h>namespace Botan {/************************************************** Wrapper Type for Bzip2 Stream                  **************************************************/struct bz_stream_wrapper   {   bz_stream stream;   bz_stream_wrapper()  { std::memset(&stream, 0, sizeof(bz_stream)); }   ~bz_stream_wrapper() { std::memset(&stream, 0, sizeof(bz_stream)); }   };/************************************************** Compress Input with Bzip                       **************************************************/void Bzip_Compression::write(const byte input[], u32bit length)   {   bz->stream.next_in = (char*)input;   bz->stream.avail_in = length;   while(bz->stream.avail_in != 0)      {      bz->stream.next_out = (char*)buffer.ptr();      bz->stream.avail_out = buffer.size();      BZ2_bzCompress(&(bz->stream), BZ_RUN);      send(buffer, buffer.size() - bz->stream.avail_out);      }   }/************************************************** Start Compressing with Bzip                    **************************************************/void Bzip_Compression::start_msg()   {   clear();   bz = new bz_stream_wrapper;   if(BZ2_bzCompressInit(&(bz->stream), level, 0, 0) != BZ_OK)      throw Exception("Bzip_Compression: Memory allocation error");   }/************************************************** Finish Compressing with Bzip                   **************************************************/void Bzip_Compression::end_msg()   {   bz->stream.next_in = 0;   bz->stream.avail_in = 0;   int rc = BZ_OK;   while(rc != BZ_STREAM_END)      {      bz->stream.next_out = (char*)buffer.ptr();      bz->stream.avail_out = buffer.size();      rc = BZ2_bzCompress(&(bz->stream), BZ_FINISH);      send(buffer, buffer.size() - bz->stream.avail_out);      }   clear();   }/************************************************** Flush the Bzip Compressor                      **************************************************/void Bzip_Compression::flush()   {   bz->stream.next_in = 0;   bz->stream.avail_in = 0;   int rc = BZ_OK;   while(rc != BZ_RUN_OK)      {      bz->stream.next_out = (char*)buffer.ptr();      bz->stream.avail_out = buffer.size();      rc = BZ2_bzCompress(&(bz->stream), BZ_FLUSH);      send(buffer, buffer.size() - bz->stream.avail_out);      }   }/************************************************** Clean up Compression Context                   **************************************************/void Bzip_Compression::clear()   {   if(!bz) return;   BZ2_bzCompressEnd(&(bz->stream));   delete bz;   bz = 0;   }/************************************************** Decompress Input with Bzip                     **************************************************/void Bzip_Decompression::write(const byte input[], u32bit length)   {   if(length) no_writes = false;   bz->stream.next_in = (char*)input;   bz->stream.avail_in = length;   while(bz->stream.avail_in != 0)      {      u64bit total_bytes = ((u64bit)bz->stream.total_in_hi32 << 32) |                           (bz->stream.total_in_lo32);      bz->stream.next_out = (char*)buffer.ptr();      bz->stream.avail_out = buffer.size();      int rc = BZ2_bzDecompress(&(bz->stream));      if(rc != BZ_OK && rc != BZ_STREAM_END)         {         clear();         if(rc == BZ_DATA_ERROR)            throw Decoding_Error("Bzip_Decompression: Data integrity error");         if(rc == BZ_DATA_ERROR_MAGIC)            throw Decoding_Error("Bzip_Decompression: Invalid input");         if(rc == BZ_MEM_ERROR)            throw Exception("Bzip_Decompression: Memory allocation error");         throw Exception("Bzip_Decompression: Unknown decompress error");         }      send(buffer, buffer.size() - bz->stream.avail_out);      if(rc == BZ_STREAM_END)         {         u32bit read_from_block = (((u64bit)bz->stream.total_in_hi32 << 32) |                                  (bz->stream.total_in_lo32)) -                                  total_bytes;         start_msg();         bz->stream.next_in = (char*)input + read_from_block;         bz->stream.avail_in = length - read_from_block;         input += read_from_block;         length -= read_from_block;         }      }   }/************************************************** Start Decompressing with Bzip                  **************************************************/void Bzip_Decompression::start_msg()   {   clear();   bz = new bz_stream_wrapper;   if(BZ2_bzDecompressInit(&(bz->stream), 0, small_mem) != BZ_OK)      throw Exception("Bzip_Decompression: Memory allocation error");   no_writes = true;   }/************************************************** Finish Decompressing with Bzip                 **************************************************/void Bzip_Decompression::end_msg()   {   if(no_writes) return;   bz->stream.next_in = 0;   bz->stream.avail_in = 0;   int rc = BZ_OK;   while(rc != BZ_STREAM_END)      {      bz->stream.next_out = (char*)buffer.ptr();      bz->stream.avail_out = buffer.size();      rc = BZ2_bzDecompress(&(bz->stream));      if(rc != BZ_OK && rc != BZ_STREAM_END)         {         clear();         throw Exception("Bzip_Decompression: Error finalizing decompression");         }      send(buffer, buffer.size() - bz->stream.avail_out);      }   clear();   }/************************************************** Clean up Decompression Context                 **************************************************/void Bzip_Decompression::clear()   {   if(!bz) return;   BZ2_bzDecompressEnd(&(bz->stream));   delete bz;   bz = 0;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -