00001
00007 #include <stdint.h>
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010
00011 #include "crc32.h"
00012
00014 #define CRC_BUFFER_SIZE 10240
00015
00017 static uint32_t crc32_table[256];
00018
00025 static uint32_t crc32_reflect(uint32_t value, const uint32_t bitsize)
00026 {
00027 uint32_t result;
00028 int i;
00029
00030 result = 0;
00031 for(i=0; i < bitsize; i++)
00032 {
00033 result = (result << 1) | (value & 1);
00034 value >>= 1;
00035 }
00036 return result;
00037 }
00038
00045 static uint32_t crc32_compute(const char *data, const size_t size, uint32_t crc)
00046 {
00047 int i;
00048
00049 crc =~ crc;
00050
00051
00052 for(i=0; i < size; i++)
00053 {
00054 crc=((crc >> 8) & 0x00ffffff) ^ crc32_table[(crc & 0xff) ^ (data[i] & 0xff)];
00055 }
00056
00057 return ~crc;
00058 }
00059
00060 void crc32_init_seed(const uint32_t polynominal)
00061 {
00062 int i, j;
00063
00064
00065 if (*crc32_table) return;
00066
00067 for(i=0; i < 256; i++)
00068 {
00069 crc32_table[i] = crc32_reflect(i, 8) << 24;
00070
00071 for(j=0; j < 8; j++)
00072 {
00073 crc32_table[i]=((crc32_table[i] << 1) ^ ((crc32_table[i] & (1 << 31)) ? polynominal : 0));
00074 }
00075 crc32_table[i] = crc32_reflect(crc32_table[i], 32);
00076 }
00077 }
00078
00079 uint32_t inline crc32(const char *data, const size_t size)
00080 {
00081 return crc32_compute(data, size, 0);
00082 }
00083
00084 uint32_t strcrc32(const char *data)
00085 {
00086 int i;
00087 uint32_t crc;
00088
00089 crc = 0xffffffff;
00090
00091
00092 for(i=0; data[i] != '\0'; i++)
00093 {
00094 crc=((crc >> 8) & 0x00ffffff) ^ crc32_table[(crc & 0xff) ^ (data[i] & 0xff)];
00095 }
00096
00097 return ~crc;
00098 }
00099
00100 uint32_t crc32_file(const char *path)
00101 {
00102 FILE *fp;
00103 char data[CRC_BUFFER_SIZE];
00104 size_t read;
00105 uint32_t crc;
00106
00107 if (path == NULL)
00108 {
00109 return 0;
00110 }
00111
00112 fp = fopen(path, "rb");
00113 if (fp == NULL)
00114 {
00115 fprintf(stderr, "crc32: unable to open file '%s'!\n", path);
00116 return 0;
00117 }
00118
00119 crc = 0;
00120 while(!feof(fp))
00121 {
00122 read = fread(data, 1, sizeof(data), fp);
00123 crc = crc32_compute(data, read, crc);
00124 }
00125
00126 fclose(fp);
00127
00128 return crc;
00129 }
00130