;2003/5/16公開
;2003/5/19更新
;********************************************************
;○ファイルのCRCを取得する
;GetFileCrc p1,p2,p3
; p1:CRCを格納する数値型変数
; p2:CRCを計算するファイル名
; p3:CRCの種類(0=16ビットCRC 1=32ビットCRC 2=両方)
;
;○変数データのCRCを取得する
;GetBufCrc p1,p2,p3,p4
; p1:CRCを格納する数値型変数
; p2:CRCを計算するデータの入った変数
; p3:p2のバイト数
; p4:CRCの種類(0=16ビットCRC 1=32ビットCRC 2=両方)
; GetFileCrcのメモリバッファ版です
;---------------------------------------------------------
#module
#const BUFSIZE 1024*1024
#deffunc initGetCrc
#define CRCPOLY16 $8408 ;CCITT
#define CRCPOLY32 $edb88320 ;CRC32
dim func,19
func.0=$57565355,$1424748b,$18246c8b,$1c24448b,$20247c8b,$508b088b,$74ed0b04,$33c03329
func.8=$8a1e8adb,$32da32c3,$08eac1c1,$3308e9c1,$04009f94,$0c330000,$754d4687,$24448be4
func.16=$8908891c,$5e5f0450,$00c35d5b
dim crctable16,256*2
dim crctable32,256
dup crctable32,crctable16.256
repeat 256
i=cnt
j=cnt
repeat 8
if i&1: i=i>>1^CRCPOLY16 :else: i=i>>1
if j&1: j=j>>1&$7fffffff^CRCPOLY32 :else: j=j>>1&$7fffffff
loop
crctable16.cnt=i
crctable32.cnt=j
loop
ll_getptr crctable16 : ll_ret pCrctable
ll_getptr crc : ll_ret pCrc
ll_getptr func : ll_ret pfunc
return
#deffunc GetFileCrc val,str,int
mref p1,16
mref filename,33
mref flag,2
alloc buf,BUFSIZE
ll_getptr buf : ll_ret pBuf
index=0
crc=$ffff,$ffffffff
repeat
bload filename,buf,BUFSIZE,index
index+=strsize
para=pBuf,strsize,pCrc,pCrctable
ll_callfunc para,4,pFunc
if strsize<BUFSIZE:break
await 0
loop
crc.1=crc.1^$ffffffff
dim buf,1
if flag==0{
p1=crc
}else{if flag==1{
p1=crc.1
}else{
p1=crc,crc.1
}}
return
#deffunc GetBufCrc val,val,int,int
mref p1,16
mref pval,1025
if pval&$ffff==2:mref var,25:else:mref var,17
mref varsize,2
mref flag,3
ll_getptr var : ll_ret pVar
crc=$ffff,$ffffffff
para=pVar,varsize,pCrc,pCrctable
ll_callfunc para,4,pFunc
crc.1=crc.1^$ffffffff
if flag==0{
p1=crc
}else{if flag==1{
p1=crc.1
}else{
p1=crc,crc.1
}}
return
#global
initGetCrc
;********************************************************
;以下使用例
dialog "",16
if stat=0:end
GetFileCrc crc,refstr,2
a=crc : b=crc.1
str a,20 : str b,24
mes refstr
mes "16bitCRC="+a
mes "32bitCRC="+b
stop
戻る