54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
#ifndef _CRC_H_
|
|
#define _CRC_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
// CRC-32 計算用
|
|
|
|
extern unsigned int crc_table[256];
|
|
extern unsigned int reverse_table[256]; // CRC-32 逆算用のテーブル
|
|
|
|
// CRC 計算用のテーブルを作る
|
|
void init_crc_table(void);
|
|
|
|
// CRC-32 を更新する
|
|
unsigned int crc_update(unsigned int crc, unsigned char *buf, unsigned int len);
|
|
unsigned int crc_update_std(unsigned int crc, unsigned char *buf, unsigned int len);
|
|
|
|
// 全て 0 のデータの CRC-32 を更新する
|
|
unsigned int crc_update_zero(unsigned int crc, unsigned int len);
|
|
|
|
// 内容が全て 0 のデータの CRC-32 を逆算するための関数
|
|
unsigned int crc_reverse_zero(unsigned int crc, unsigned int len);
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
// par2cmdline を参考にした関数
|
|
// window サイズの CRC を計算してある所に、1バイトずつ追加と削除をして、CRC を更新する
|
|
extern unsigned int window_table[256];
|
|
extern unsigned int window_mask;
|
|
|
|
void onepass_window_gen(unsigned int window_size);
|
|
void onepass_window_gen_short(unsigned int short_size, unsigned int short_table[256]);
|
|
|
|
// マクロなら
|
|
#define CRC_SLIDE_CHAR(x,y,z) (crc_table[((x) & 0xFF) ^ (y)] ^ ((x) >> 8) ^ window_table[z])
|
|
|
|
/*
|
|
// インライン展開なら
|
|
__inline unsigned int crc_slide_char(unsigned int crc, unsigned char chNew, unsigned char chOld){
|
|
return crc_table[(crc & 0xFF) ^ chNew] ^ (crc >> 8) ^ window_table[chOld];
|
|
}
|
|
*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|