/* Compute CRC32 from file or stdin. */ #include #include #ifdef _WIN32 #include #include #endif /* Table for updating CRC one byte at a time. */ static uint32_t crc_table[256]; /* Read buffer. */ static uint8_t read_buffer[4096]; /* Initialize crc_table. */ static void InitCrcTable(void) { static const uint32_t kPoly = 0xedb88320U; for(int i = 0; i < 256; i++) { uint32_t crc = i; for(int j = 8; j > 0; j--) { if( (crc & 1) != 0 ) crc = (crc >> 1) ^ kPoly; else crc >>= 1; } crc_table[i] = crc; } } /* Checksum input until end of file. */ static void Crc32(FILE *infile) { size_t read_size; uint32_t crc = ~0; while( (read_size = fread(read_buffer, 1, sizeof(read_buffer), infile)) > 0 ) { for(size_t i = 0; i < read_size; i++) { crc = ((crc >> 8) & 0xffffff) ^ crc_table[(crc ^ read_buffer[i]) & 0xff]; } if( read_size < sizeof(read_buffer) ) break; } printf("%08x\n", ~crc); } int main(int argc, char **argv) { FILE *infile = NULL; if( argc > 2 ) return printf("%s [input]\n", *argv); #ifdef _WIN32 setmode(STDIN_FILENO, O_BINARY); #endif /* Open file specified on command line for reading, unless it's "-". */ if( argc == 2 && (argv[1][0] != '-' || argv[1][1] != '\0') ) { if( (infile = fopen(argv[1], "rb")) == NULL ) return printf("Error opening %s\n", argv[1]); } InitCrcTable(); if( infile != NULL ) { Crc32(infile); return fclose(infile); } Crc32(stdin); return 0; }