今、いろいろなハッシュ値を求めるソフトを作っています。
CRC16を求めるプログラムを作りたいのですが、どうすればいいかわかりません。
できればテーブルを埋め込まず、実行時に計算してテーブルを作りたいです。
このCRC32を求めるプログラムは成功しました。
#include "crc32.h"
static unsigned int CRC32table[256];
static int inited=0;
static unsigned int crc;
void crc32init(void) {
if(!inited) {
int n;
for(n=0;n<256;n++) {
unsigned int c=(unsigned int)n;
int k;
for(k=0;k<8;k++) {
if(c & 1) {
c=0xEDB88320u ^ (c>>1);
} else {
c>>=1;
}
}
CRC32table[n]=c;
}
inited=1;
}
crc=0xFFFFFFFFu;
}
void crc32addData(const void* data,int dataSize) {
unsigned char* now=(unsigned char*)data;
int i;
for(i=0;i<dataSize;i++) {
crc=CRC32table[(crc ^ (*now))&0xFF]^(crc>>8);
now++;
}
}
void crc32finish(unsigned char* crc32,const void* data,int dataSize) {
crc32addData(data,dataSize);
crc=~crc;
crc32[0]=(crc>>24)&0xff;
crc32[1]=(crc>>16)&0xff;
crc32[2]=(crc>>8)&0xff;
crc32[3]=crc&0xff;
} fp=fopen(argv[1],"rb");
if(fp==NULL) {
fprintf(stderr,"File open error\n");
return 1;
}
initFunc();
while(!feof(fp)) {
readSize=fread(buffer,1,BUFFER_SIZE,fp);
if(readSize<BUFFER_SIZE) {
finishFunc(theHash,buffer,readSize);
} else {
addDataFunc(buffer,BUFFER_SIZE);
}
}initFuncにはcrc32init、addDataFuncはcrc32addData、finishFuncはcrc32finishのポインタが入っています。
これと同じような感じでCRC16を求めたいのですが、どうすればいいのでしょうか?
今書いたコードをこれです。CRC32のコードをちょっとだけ書き換えただけであり、うまくいきません。
#include "crc16.h"
static unsigned short CRC16table[256];
static int inited=0;
static unsigned short crc;
void crc16init(void) {
if(!inited) {
int n;
for(n=0;n<256;n++) {
unsigned short c=(unsigned short)n;
int k;
for(k=0;k<8;k++) {
if(c & 1) {
c=0xA001 ^ (c>>1);
} else {
c>>=1;
}
}
CRC16table[n]=c;
}
inited=1;
}
crc=0xFFFF;
}
void crc16addData(const void* data,int dataSize) {
unsigned char* now=(unsigned char*)data;
int i;
for(i=0;i<dataSize;i++) {
crc=CRC16table[(crc ^ (*now))&0xFF]^(crc>>8);
now++;
}
}
void crc16finish(unsigned char* crc16,const void* data,int dataSize) {
crc16addData(data,dataSize);
crc=~crc;
crc16[0]=(crc>>8)&0xff;
crc16[1]=crc&0xff;
}また、この質問ではlzhで記録されるCRC16を求めたいのですが、
同じabcというデータのCRC16をgizmoで求めるとa8b6となりました。
また、hira様のcrc.dllで求めると、61DAとなりました。
CRC16はどれを信じればいいのでしょうか?
lzhは+Lhaca Version1.24で作成しました。
メモとしてWikipediaへのリンクを置いておきます。