;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



戻る