/* shia0.c - Don Yang (uguu.org) 02/17/03 */ #include #include #define BUFSIZE 8192 int main(int argc, char **argv) { unsigned char buffer[BUFSIZE]; int a, i, size, filesize, freq[256]; double p, entropy, log2; FILE *infile; if( argc < 2 ) return printf("%s [...]\n", *argv); log2 = log(2); for(a = 1; a < argc; a++) { printf("%s: ", argv[a]); if( (infile = fopen(argv[a], "rb")) == NULL ) { puts("fopen() failed"); } else { for(i = filesize = 0; i < 256; freq[i++] = 0); for(; !feof(infile); filesize += size) { if( !(size = fread(buffer, 1, BUFSIZE, infile)) ) break; for(i = 0; i < size; freq[buffer[i++]]++); } fclose(infile); for(entropy = i = 0; i < 256; i++) if( freq[i] ) { p = freq[i] / (double)filesize; entropy -= p * log(p) / log2; } printf("%f bits\n", entropy); } } return 0; }