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

📄 dcodrle4.c

📁 著名压缩算法的实现
💻 C
字号:
/* File: dcodrle4.c   Author: David Bourgin   Creation date: 1/2/94   Last update: 22/5/94   Purpose: Example of RLE type 4 decoding with a file source to decompress.*/#include <stdio.h>/* For routines printf,fgetc,fread and fwrite */#include <memory.h>/* For routines memset,memcpy */#include <stdlib.h>/* For routine exit *//* Error codes sent to the caller */#define NO_ERROR      0#define BAD_FILE_NAME 1#define BAD_ARGUMENT  2/* Useful constants */#define FALSE 0#define TRUE  1/* Global variables */FILE *source_file,*dest_file;                             /* Being that fgetc=EOF only after an access                                then 'byte_stored_status' is 'TRUE' if a byte has been stored by 'fgetc'                                or 'FALSE' if there's no valid byte not already read and not handled in 'val_byte_stored' */int byte_stored_status=FALSE;int val_byte_stored;/* Pseudo procedures */#define end_of_data()  (byte_stored_status?FALSE:!(byte_stored_status=((val_byte_stored=fgetc(source_file))!=EOF)))#define read_byte()  (byte_stored_status?byte_stored_status=FALSE,(unsigned char)val_byte_stored:(unsigned char)fgetc(source_file))#define read_array(array,nb_to_read)  { if (byte_stored_status)\                                          { *(array)=(unsigned char)val_byte_stored;\                                            byte_stored_status=FALSE;\                                            if ((nb_to_read)>1)\                                               (void)fread(&((array)[1]),1,(nb_to_read)-1,source_file);\                                          }\                                       else (void)fread((array),1,(nb_to_read),source_file);\                                     }#define write_array(array,array_size)  ((void)fwrite((array),1,(array_size),dest_file))#define fill_array(array,nb_to_fill,value)  ((void)memset((array),(value),(nb_to_fill)))#define block_copy(source,destination,source_size,nb_of_time)  { register unsigned int i, index=0;\                                                                 for (i=1;i<=(nb_of_time);i++)\                                                                     { (void)memcpy(&((destination)[index]),(source),(source_size));\                                                                       index += (source_size);\                                                                     }\                                                               }void rle4decoding()/* Returned parameters: None   Action: Decompresses with RLE type 4 method all bytes read by the function read_byte   Erreurs: An input/output error could disturb the running of the program*/{ unsigned char byte_code;  unsigned int frame_size,frame_nb;  unsigned char frame[16705];  while (!end_of_data())        { byte_code=read_byte();          switch (byte_code & 192)          { case 0:          /* Frames repetition of 1 byte                                Encoding [00xxxxxx|1 byte] */                   frame_size=(byte_code & 63)+2;                   fill_array(frame,frame_size,read_byte());                   break;            case 64:         /* Frames repetition of less 66 bytes                                Encoding [01xxxxxx|xxxxxxxx|1 byte] */                    frame_size=(((unsigned int)(byte_code & 63)) << 8)+read_byte()+66;                    fill_array(frame,frame_size,read_byte());                    break;            case 128:        /* Frame with several bytes                                Encoding [10xxxxxx|yyyyyyyy|n bytes] */                     frame_size=(byte_code & 63)+2;                     frame_nb=((unsigned int)read_byte())+2;                     read_array(frame,frame_size);                     block_copy(frame,frame+frame_size,frame_size,frame_nb);                     frame_size *= frame_nb;                     break;            case 192:        /* No repetition                                Encoding [110xxxxxx|n octets] or [111xxxxxx|yyyyyyyy|n octets] */                     frame_size=byte_code & 31;                     if (!(byte_code & 32))                             /* Non repetition of less 33 bytes [110xxxxxx|n bytes] ? */                        frame_size++;                     else frame_size=(frame_size << 8)+read_byte()+33;                     read_array(frame,frame_size);                     break;          }          write_array(frame,frame_size);        }}void aide()/* Returned parameters: None   Action: Displays the help of the program and the stop its running   Erreurs: None*/{ printf("This utility enables you to decompress a file by using RLE type 4 method\n");  printf("as given in 'La Video et Les Imprimantes sur PC'\n");  printf("\nUse: dcodrle4 source target\n");  printf("source: Name of the file to decompress\n");  printf("target: Name of the restored file\n");}int main(argc,argv)/* Returned parameters: Returns an error code (0=None)   Action: Main procedure   Erreurs: Detected, handled and an error code is returned, if any*/int argc;char *argv[];{ if (argc!=3)     { aide();       exit(BAD_ARGUMENT);     }  else if ((source_file=fopen(argv[1],"rb"))==NULL)          { aide();            exit(BAD_FILE_NAME);          }       else if ((dest_file=fopen(argv[2],"wb"))==NULL)               { aide();                 exit(BAD_FILE_NAME);               }            else { rle4decoding();                   fclose(source_file);                   fclose(dest_file);                 }  printf("Execution of dcodrle4 completed.\n");  return (NO_ERROR);}

⌨️ 快捷键说明

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