Advertisement
FlyFar

compress.c

Mar 23rd, 2023
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | Cybersecurity | 0 0
  1. #include <stdio.h>
  2.  
  3. #define BUFFER_SIZE 32768
  4.  
  5. #define LMIN 4
  6. #define LMAX 255
  7.  
  8. int main(int argc, char **argv) {
  9.     if (argc != 3) {
  10.         fprintf(stderr, "Usage: compress [input file] [output file]\n");
  11.         return 1;
  12.     }
  13.    
  14.     FILE *infile = fopen(argv[1], "rb");
  15.     if (!infile) {
  16.         fprintf(stderr, "Could not open input file for reading.\n");
  17.         return 2;
  18.     }
  19.    
  20.     unsigned char buf[BUFFER_SIZE] = { 0 };
  21.     int fsize = fread(buf, 1, BUFFER_SIZE, infile);
  22.    
  23.     if (fsize >= BUFFER_SIZE) {
  24.         fprintf(stderr, "The input file is too large for compressing!\n");
  25.         return 3;
  26.     } else if (fsize <= 0) {
  27.         fprintf(stderr, "The input file is empty.\n");
  28.         return 3;
  29.     }
  30.    
  31.     fclose(infile);
  32.    
  33.     FILE *outfile = fopen(argv[2], "wb");
  34.     if (!outfile) {
  35.         fprintf(stderr, "Could not open output file for writing.\n");
  36.         return 2;
  37.     }
  38.    
  39.     unsigned char bytes[BUFFER_SIZE] = { 0 };
  40.     int bi = 0;
  41.    
  42.     int pos = 0;
  43.     while (pos < fsize) {
  44.         unsigned char l = 0, ml = 0;
  45.         short p = 0, mp = 0;
  46.        
  47.         for (; p < pos; p++) {
  48.             if (l >= LMAX)
  49.                 break;
  50.            
  51.             if (buf[p] == buf[pos+l]) {
  52.                 l++;
  53.             } else {
  54.                 if (l >= ml) {
  55.                     ml = l;
  56.                     mp = p;
  57.                 }
  58.                
  59.                 p -= l;
  60.                 l = 0;
  61.             }
  62.         }
  63.        
  64.         if (l >= ml) {
  65.             ml = l;
  66.             mp = p;
  67.         }
  68.        
  69.         if (ml >= LMIN) {
  70.             int bs = 0;
  71.             while (bi > 0) {
  72.                 int bx = bi;
  73.                 if (bx > 128) bx = 128;
  74.  
  75.                 unsigned char b = (1 << 7) | (bx-1);
  76.  
  77.                 fwrite(&b, 1, 1, outfile);
  78.                 fwrite(bytes + bs, 1, bx, outfile);
  79.  
  80.                 bi -= bx;
  81.                 bs += bx;
  82.             }
  83.  
  84.             //bi = 0;
  85.            
  86.             mp = (mp - ml);
  87.             mp = (mp >> 8) | (mp << 8);
  88.             fwrite(&mp, 2, 1, outfile);
  89.             fwrite(&ml, 1, 1, outfile);
  90.            
  91.             pos += ml;
  92.         } else {
  93.             bytes[bi++] = buf[pos++];
  94.         }
  95.        
  96.         printf("Position: %d/%d\n", pos, fsize);
  97.     }
  98.  
  99.     int bs = 0;
  100.     while (bi > 0) {
  101.         int bx = bi;
  102.         if (bx > 128) bx = 128;
  103.  
  104.         char b = (1 << 7) | (bx - 1);
  105.         fwrite(&b, 1, 1, outfile);
  106.         fwrite(bytes + bs, 1, bx, outfile);
  107.  
  108.         bi -= 128;
  109.         bs += 128;
  110.     }
  111.    
  112.     fclose(outfile);
  113.     system("pause");
  114.    
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement