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

📄 bcltest.c

📁 基本压缩解压功能大全.包括Huffuman算法,RLE算法,LZ算法,rice算法,shannon算 法.带有测试文件.
💻 C
字号:
/************************************************************************** Name:        bcltest.c* Author:      Marcus Geelnard* Description: Basic Compression Library tester.** This program can be used to test any of the compression algorithms in* the Basic Compression Library. The program reads a file, which is* compressed and decompressed and compared in order to detect any errors* in the compression and/or decompression routines. Also, the compression* ratio and speed is shown.**-------------------------------------------------------------------------* Copyright (c) 2003-2006 Marcus Geelnard** This software is provided 'as-is', without any express or implied* warranty. In no event will the authors be held liable for any damages* arising from the use of this software.** Permission is granted to anyone to use this software for any purpose,* including commercial applications, and to alter it and redistribute it* freely, subject to the following restrictions:** 1. The origin of this software must not be misrepresented; you must not*    claim that you wrote the original software. If you use this software*    in a product, an acknowledgment in the product documentation would*    be appreciated but is not required.** 2. Altered source versions must be plainly marked as such, and must not*    be misrepresented as being the original software.** 3. This notice may not be removed or altered from any source*    distribution.** Marcus Geelnard* marcus.geelnard at home.se*************************************************************************//* Standard libraries */#include <stdio.h>#include <stdlib.h>#include <string.h>/* Basic Compression Library */#include "rle.h"#include "shannonfano.h"#include "huffman.h"#include "rice.h"#include "lz.h"/* Timing */#include "systimer.h"/************************************************************************** GetFileSize()*************************************************************************/long GetFileSize( FILE *f ){  long pos, size;  pos = ftell( f );  fseek( f, 0, SEEK_END );  size = ftell( f );  fseek( f, pos, SEEK_SET );  return size;}/************************************************************************** TestFile()*************************************************************************/int TestFile( char *name, int algo ){  unsigned int  insize, outsize, bufsize, *work, k, err_count;  unsigned char *in, *out, *buf;  FILE          *f;  double        t0, t_comp, t_uncomp;  printf( "Testing %s...", name );  /* Open input file */  f = fopen( name, "rb" );  if( !f )  {    printf( "unable to open!\n" );    return 0;  }  /* Get input size */  insize = GetFileSize( f );  if( insize < 1 )  {    printf( "empty file!\n" );    fclose( f );    return 0;  }  /* Worst case output buffer size */  bufsize = (insize*104+50)/100 + 384;  /* Allocate memory */  in = (unsigned char *) malloc( insize + 2*bufsize );  if( !in )  {    printf( "out of memory!\n" );    fclose( f );    return 0;  }  /* Pointers to compression buffer and output memory */  buf = &in[ insize ];  out = &buf[ bufsize ];  /* Read and close input file */  fread( in, 1, insize, f );  fclose( f );  /* Compress and decompress */  switch( algo )  {    case 1:      t0 = GetTime();      outsize = RLE_Compress( in, buf, insize );      t_comp = GetTime() - t0;      t0 = GetTime();      RLE_Uncompress( buf, out, outsize );      t_uncomp = GetTime() - t0;      break;    case 2:      t0 = GetTime();      outsize = Huffman_Compress( in, buf, insize );      t_comp = GetTime() - t0;      t0 = GetTime();      Huffman_Uncompress( buf, out, outsize, insize );      t_uncomp = GetTime() - t0;      break;    case 3:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT8 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT8 );      t_uncomp = GetTime() - t0;      break;    case 4:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT16 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT16 );      t_uncomp = GetTime() - t0;      break;    case 5:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_UINT32 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_UINT32 );      t_uncomp = GetTime() - t0;      break;    case 6:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT8 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT8 );      t_uncomp = GetTime() - t0;      break;    case 7:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT16 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT16 );      t_uncomp = GetTime() - t0;      break;    case 8:      t0 = GetTime();      outsize = Rice_Compress( in, buf, insize, RICE_FMT_INT32 );      t_comp = GetTime() - t0;      t0 = GetTime();      Rice_Uncompress( buf, out, outsize, insize, RICE_FMT_INT32 );      t_uncomp = GetTime() - t0;      break;    case 9:      t0 = GetTime();      outsize = LZ_Compress( in, buf, insize );      t_comp = GetTime() - t0;      t0 = GetTime();      LZ_Uncompress( buf, out, outsize );      t_uncomp = GetTime() - t0;      break;    case 10:      work = malloc( sizeof(unsigned int) * (65536+insize) );      if( work )      {        t0 = GetTime();        outsize = LZ_CompressFast( in, buf, insize, work );        t_comp = GetTime() - t0;        free( work );        t0 = GetTime();        LZ_Uncompress( buf, out, outsize );        t_uncomp = GetTime() - t0;      }      else      {        printf( "unable to allocate working buffer!\n" );        t_comp = 0.0;        t_uncomp = 0.0;        outsize = 0;      }      break;    case 11:      t0 = GetTime();      outsize = SF_Compress( in, buf, insize );      t_comp = GetTime() - t0;      t0 = GetTime();      SF_Uncompress( buf, out, outsize, insize );      t_uncomp = GetTime() - t0;      break;    default:      /* Should never happen... */      outsize = 0;      t_comp = 0.0;      t_uncomp = 0.0;  }  err_count = 0;  if(outsize > 0)  {    /* Show compression result */    printf( "\n  Compression: %d/%d bytes (%.1f%%)", outsize, insize,            100*(float)outsize/(float)insize );    /* Compare input / output data */    for( k = 0; k < insize; ++ k )    {      if( in[ k ] != out[ k ] )      {        if( err_count == 0 ) printf( "\n" );        if( err_count == 30 ) printf( "    ...\n" );        else if( err_count < 30 )        {            printf( "    %d: %d != %d\n", k, out[ k ], in[ k ] );        }        ++ err_count;      }    }    /* Did we have success? */    if( err_count == 0 )    {      printf( " - OK!\n" );      printf( "    Compression speed: %.1f KB/s (%.2f ms)\n",              (double) insize / (1024.0 * t_comp), 1000.0 * t_comp );      printf( "    Uncompression speed: %.1f KB/s (%.2f ms)\n",              (double) insize / (1024.0 * t_uncomp), 1000.0 * t_uncomp );    }    else    {      printf( "    *******************************\n" );      printf( "    ERROR: %d faulty bytes\n", err_count );      printf( "    *******************************\n" );    }  }  /* Free all memory */  free( in );  return (outsize > 0) && (err_count == 0);}/************************************************************************** Help()*************************************************************************/void Help( char *prgname ){  printf( "Usage: %s algo file\n\n", prgname );  printf( "algo can be one of the following:\n" );  printf( "  rle     RLE Compression\n" );  printf( "  sf      Shannon-Fano compression\n" );  printf( "  huff    Huffman compression\n" );  printf( "  lz      LZ77 Compression\n" );  printf( "  lz_f    LZ77 Compression - fast method\n" );  printf( "  rice8   Rice compresison of 8-bit data\n" );  printf( "  rice16  Rice compresison of 16-bit data\n" );  printf( "  rice32  Rice compresison of 32-bit data\n" );  printf( "  rice8s  Rice compresison of 8-bit signed data\n" );  printf( "  rice16s Rice compresison of 16-bit signed data\n" );  printf( "  rice32s Rice compresison of 32-bit signed data\n\n" );  printf( "file is the name of a file to be tested.\n" );}/************************************************************************** main()*************************************************************************/int main( int argc, char **argv ){  int     algo;  char    *filename;  /* Check arguments */  if( argc != 3 )  {    Help( argv[ 0 ] );    return 0;  }  /* Get algo */  algo = 0;  if( strcmp( argv[1], "rle" ) == 0 )     algo = 1;  if( strcmp( argv[1], "huff" ) == 0 )    algo = 2;  if( strcmp( argv[1], "rice8" ) == 0 )   algo = 3;  if( strcmp( argv[1], "rice16" ) == 0 )  algo = 4;  if( strcmp( argv[1], "rice32" ) == 0 )  algo = 5;  if( strcmp( argv[1], "rice8s" ) == 0 )  algo = 6;  if( strcmp( argv[1], "rice16s" ) == 0 ) algo = 7;  if( strcmp( argv[1], "rice32s" ) == 0 ) algo = 8;  if( strcmp( argv[1], "lz" ) == 0 )      algo = 9;  if( strcmp( argv[1], "lz_f" ) == 0 )    algo = 10;  if( strcmp( argv[1], "sf" ) == 0 )      algo = 11;  if( !algo )  {    Help( argv[ 0 ] );    return 0;  }  /* Get file name */  filename = argv[2];  /* Initialize timer */  InitTimer();  /* Test file */  TestFile( filename, algo );  return 0;}

⌨️ 快捷键说明

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