Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #pragma pack(1)
  6.  
  7. typedef unsigned short word;
  8. typedef unsigned int   uint;
  9. typedef unsigned char  byte;
  10.  
  11. enum{ SCALE=1<<15 };
  12.  
  13. struct EMP {
  14.   byte sym;
  15.   short p1[8];
  16.   short p2[8];
  17. };
  18.  
  19. void processfile( FILE* f, FILE* g ) {
  20.  
  21.   uint c,i,j,l; int p1,p2,bit;
  22.   double clen = 0;
  23.  
  24.   EMP emp;
  25.  
  26.   while(1) {
  27.  
  28.     l = fread( &emp, 1,sizeof(emp), f ); if( l<sizeof(emp) ) break;
  29.  
  30.     c = emp.sym;
  31.  
  32.     for( i=7,j=1; i!=-1; i-- ) {
  33.       bit = (c>>i)&1;
  34.  
  35.       p1 = emp.p1[7-i];
  36.  
  37.       p1*=8;
  38.       p1 = (p1>0) ? ((p1<SCALE) ? p1 : SCALE-1) : 1;
  39.       p1 = bit ? p1 : SCALE-p1;
  40. //      p1 = bit ? SCALE-p1 : p1;
  41.  
  42.       clen -= log(double(p1)/SCALE)/log(2.0);
  43.  
  44.       if( bit==1 ) p1 &= SCALE-1; else p1 |= SCALE;
  45.       putc(p1>>8,g); putc(p1,g);
  46.  
  47.       j += j+bit;
  48.     }
  49.  
  50. //    putc( emp.sym, g );
  51.   }
  52.  
  53.   printf( "clen=%.3lf\n", clen/8 );
  54.  
  55.   return;
  56. }
  57.  
  58. int main( int argc, char** argv ) {
  59.  
  60.   if( argc<3 ) return 1;
  61.  
  62.   FILE* f = fopen(argv[1],"rb"); if( f==0 ) return 2; // input dict
  63.   FILE* g = fopen(argv[2],"wb"); if( g==0 ) return 3; // output dict
  64.  
  65.   processfile( f, g );
  66.  
  67.   return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement