Files
MultiPar/source/sfv_md5/crc.c
2023-03-12 11:07:38 +09:00

52 lines
1.2 KiB
C

// crc.c
// Copyright : 2021-05-14 Yutaka Sawada
// License : The MIT license
#include "crc.h"
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// CRC-32 計算用
// CRC-32
#define CRC_POLY 0xEDB88320 // (little endian)
unsigned int crc_table[256];
// CRC 計算用のテーブルを作る
void init_crc_table(void)
{
unsigned int i, j, r;
for (i = 0; i < 256; i++){ // CRC-32
r = i;
for (j = 0; j < 8; j++)
r = (r >> 1) ^ (CRC_POLY & ~((r & 1) - 1));
crc_table[i] = r;
}
}
// CRC-32 を更新する
unsigned int crc_update(unsigned int crc, unsigned char *buf, unsigned int len)
{
/*
while (len--)
crc = crc_table[(crc & 0xFF) ^ (*buf++)] ^ (crc >> 8);
*/
// 4バイトごとに計算する
while (len >= 4){
crc ^= *((unsigned int *)buf);
crc = crc_table[crc & 0xFF] ^ (crc >> 8);
crc = crc_table[crc & 0xFF] ^ (crc >> 8);
crc = crc_table[crc & 0xFF] ^ (crc >> 8);
crc = crc_table[crc & 0xFF] ^ (crc >> 8);
len -= 4;
buf += 4;
}
// 余りは 1バイトずつ計算する
while (len--)
crc = crc_table[(crc & 0xFF) ^ (*buf++)] ^ (crc >> 8);
return crc;
}