Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #pragma pack(1)
- typedef unsigned short word;
- typedef unsigned int uint;
- typedef unsigned char byte;
- enum{ SCALE=1<<15 };
- struct EMP {
- byte sym;
- short p1[8];
- short p2[8];
- };
- void processfile( FILE* f, FILE* g ) {
- uint c,i,j,l; int p1,p2,bit;
- double clen = 0;
- EMP emp;
- while(1) {
- l = fread( &emp, 1,sizeof(emp), f ); if( l<sizeof(emp) ) break;
- c = emp.sym;
- for( i=7,j=1; i!=-1; i-- ) {
- bit = (c>>i)&1;
- p1 = emp.p1[7-i];
- p1*=8;
- p1 = (p1>0) ? ((p1<SCALE) ? p1 : SCALE-1) : 1;
- p1 = bit ? p1 : SCALE-p1;
- // p1 = bit ? SCALE-p1 : p1;
- clen -= log(double(p1)/SCALE)/log(2.0);
- if( bit==1 ) p1 &= SCALE-1; else p1 |= SCALE;
- putc(p1>>8,g); putc(p1,g);
- j += j+bit;
- }
- // putc( emp.sym, g );
- }
- printf( "clen=%.3lf\n", clen/8 );
- return;
- }
- int main( int argc, char** argv ) {
- if( argc<3 ) return 1;
- FILE* f = fopen(argv[1],"rb"); if( f==0 ) return 2; // input dict
- FILE* g = fopen(argv[2],"wb"); if( g==0 ) return 3; // output dict
- processfile( f, g );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement