文件内容为2进制数据,采用CRC-CCITT: G(D)=D16+D12+D5+1方式效验,如何通过文件内容获得效验码呢?
解决方案 »
- 有谁用过ClsIPEdit这个控件?
- 恳求哪位前辈帮着将下面的C++代码转换成DELPHI的,万分感谢!
- 在delphi7.0+access怎么实现重新登陆?
- 毕业设计要做单机五子棋,现求算法及设计思路
- 再散
- TListBox如何实现鼠标拖动,使其Items[]的内容变换位置
- 在win98第二版下,如何判断是否已经建立了拨号连接?????100分够吗?不够再加!
- bcb和delphi中一些变量前缀用的是 F ;比如 FSize: Integer; 这个F是什么单词的缩写。
- 那位大虾知道clientdataset中实现统计的方法?
- 怎样动态切换SpeenButton的图标?
- dbgrideh 如何在日文系统显示?
- result从哪里冒出来的?
为什么得不到呢?效验方式知道啊CRC-CCITT: G(D)=D16+D12+D5+1
unit Crc32;interface{$I VCheck.inc}{$R-,Q-}function UpdateCrc32(InitCRC: LongInt; const InBuf; InLen: Integer): LongInt;implementationconst
Crc32tab: array [0..255] of {$IFDEF V_D4}Cardinal{$ELSE}LongInt{$ENDIF} = (
$000000000, $077073096, $0ee0e612c, $0990951ba,
$0076dc419, $0706af48f, $0e963a535, $09e6495a3,
$00edb8832, $079dcb8a4, $0e0d5e91e, $097d2d988,
$009b64c2b, $07eb17cbd, $0e7b82d07, $090bf1d91, $01db71064, $06ab020f2, $0f3b97148, $084be41de,
$01adad47d, $06ddde4eb, $0f4d4b551, $083d385c7,
$0136c9856, $0646ba8c0, $0fd62f97a, $08a65c9ec,
$014015c4f, $063066cd9, $0fa0f3d63, $08d080df5, $03b6e20c8, $04c69105e, $0d56041e4, $0a2677172,
$03c03e4d1, $04b04d447, $0d20d85fd, $0a50ab56b,
$035b5a8fa, $042b2986c, $0dbbbc9d6, $0acbcf940,
$032d86ce3, $045df5c75, $0dcd60dcf, $0abd13d59, $026d930ac, $051de003a, $0c8d75180, $0bfd06116,
$021b4f4b5, $056b3c423, $0cfba9599, $0b8bda50f,
$02802b89e, $05f058808, $0c60cd9b2, $0b10be924,
$02f6f7c87, $058684c11, $0c1611dab, $0b6662d3d, $076dc4190, $001db7106, $098d220bc, $0efd5102a,
$071b18589, $006b6b51f, $09fbfe4a5, $0e8b8d433,
$07807c9a2, $00f00f934, $09609a88e, $0e10e9818,
$07f6a0dbb, $0086d3d2d, $091646c97, $0e6635c01, $06b6b51f4, $01c6c6162, $0856530d8, $0f262004e,
$06c0695ed, $01b01a57b, $08208f4c1, $0f50fc457,
$065b0d9c6, $012b7e950, $08bbeb8ea, $0fcb9887c,
$062dd1ddf, $015da2d49, $08cd37cf3, $0fbd44c65, $04db26158, $03ab551ce, $0a3bc0074, $0d4bb30e2,
$04adfa541, $03dd895d7, $0a4d1c46d, $0d3d6f4fb,
$04369e96a, $0346ed9fc, $0ad678846, $0da60b8d0,
$044042d73, $033031de5, $0aa0a4c5f, $0dd0d7cc9, $05005713c, $0270241aa, $0be0b1010, $0c90c2086,
$05768b525, $0206f85b3, $0b966d409, $0ce61e49f,
$05edef90e, $029d9c998, $0b0d09822, $0c7d7a8b4,
$059b33d17, $02eb40d81, $0b7bd5c3b, $0c0ba6cad, $0edb88320, $09abfb3b6, $003b6e20c, $074b1d29a,
$0ead54739, $09dd277af, $004db2615, $073dc1683,
$0e3630b12, $094643b84, $00d6d6a3e, $07a6a5aa8,
$0e40ecf0b, $09309ff9d, $00a00ae27, $07d079eb1, $0f00f9344, $08708a3d2, $01e01f268, $06906c2fe,
$0f762575d, $0806567cb, $0196c3671, $06e6b06e7,
$0fed41b76, $089d32be0, $010da7a5a, $067dd4acc,
$0f9b9df6f, $08ebeeff9, $017b7be43, $060b08ed5, $0d6d6a3e8, $0a1d1937e, $038d8c2c4, $04fdff252,
$0d1bb67f1, $0a6bc5767, $03fb506dd, $048b2364b,
$0d80d2bda, $0af0a1b4c, $036034af6, $041047a60,
$0df60efc3, $0a867df55, $0316e8eef, $04669be79, $0cb61b38c, $0bc66831a, $0256fd2a0, $05268e236,
$0cc0c7795, $0bb0b4703, $0220216b9, $05505262f,
$0c5ba3bbe, $0b2bd0b28, $02bb45a92, $05cb36a04,
$0c2d7ffa7, $0b5d0cf31, $02cd99e8b, $05bdeae1d, $09b64c2b0, $0ec63f226, $0756aa39c, $0026d930a,
$09c0906a9, $0eb0e363f, $072076785, $005005713,
$095bf4a82, $0e2b87a14, $07bb12bae, $00cb61b38,
$092d28e9b, $0e5d5be0d, $07cdcefb7, $00bdbdf21, $086d3d2d4, $0f1d4e242, $068ddb3f8, $01fda836e,
$081be16cd, $0f6b9265b, $06fb077e1, $018b74777,
$088085ae6, $0ff0f6a70, $066063bca, $011010b5c,
$08f659eff, $0f862ae69, $0616bffd3, $0166ccf45, $0a00ae278, $0d70dd2ee, $04e048354, $03903b3c2,
$0a7672661, $0d06016f7, $04969474d, $03e6e77db,
$0aed16a4a, $0d9d65adc, $040df0b66, $037d83bf0,
$0a9bcae53, $0debb9ec5, $047b2cf7f, $030b5ffe9, $0bdbdf21c, $0cabac28a, $053b39330, $024b4a3a6,
$0bad03605, $0cdd70693, $054de5729, $023d967bf,
$0b3667a2e, $0c4614ab8, $05d681b02, $02a6f2b94,
$0b40bbe37, $0c30c8ea1, $05a05df1b, $02d02ef8d);type
{$IFNDEF V_32}
TByteArray = array [0..MaxInt] of Byte;
{$ELSE}
TByteArray = array [0..1073741823] of Byte;
{$ENDIF}function UpdateCrc32(InitCRC: LongInt; const InBuf; InLen: Integer): LongInt;
{$IFNDEF USE_ASM}
var
I: Integer;
begin
for I:=0 to InLen - 1 do
InitCRC := crc32tab[Byte(InitCRC xor LongInt(TByteArray(InBuf)[I]))] xor
((InitCRC shr 8){ and $00FFFFFF});
Result:=InitCRC;
end;
{$ELSE} assembler;
asm
{$IFNDEF V_32}
mov ax, ds
push ax
mov es, ax
lds si, Inbuf
mov ax, word ptr InitCRC
mov dx, word ptr InitCRC + 2
mov cx, Inlen
jcxz @@done
cld
@@loop: xor bh,bh
mov bl,al
lodsb
xor bl,al
mov al,ah
mov ah,dl
mov dl,dh
xor dh,dh
shl bx,2
xor ax, word ptr es:[bx + crc32tab]
xor dx, word ptr es:[bx + crc32tab + 2]
dec cx
jnz @@loop
@@done:
pop ds
{$ELSE} // eax = InitCRC; edx = @InBuf; ecx = InLen
{$IFDEF V_FREEPASCAL}
mov eax, InitCRC
mov ecx, InLen
mov edx, InBuf
{$ENDIF}
or ecx, ecx
jle @@done
push ebx
xor ebx, ebx
@@loop: xor al, [edx]
inc edx
mov bl, al
shr eax, 8
xor eax, dword ptr [ebx * 4 + crc32tab]
dec ecx
jnz @@loop
pop ebx
@@done:
{$ENDIF}
end{$IFDEF V_FREEPASCAL} ['eax','ecx','edx']{$ENDIF};
{$ENDIF}end.
asm
AND EDX,EDX
JZ @Exit
AND ECX,ECX
JLE @Exit
PUSH EBX
PUSH EDI
XOR EBX,EBX
LEA EDI,CS:[OFFSET @CRC16]
@Start: MOV BL,[EDX]
XOR BL,AL
SHR AX,8
XOR AX,[EDI + EBX * 2]
INC EDX
DEC ECX
JNZ @Start
POP EDI
POP EBX
@Exit: RET
db 0,0
//@CRC16: DW 00000h, 0C0C1h, 0C181h, 00140h, 0C301h, 003C0h, 00280h, 0C241h
// DW 0C601h, 006C0h, 00780h, 0C741h, 00500h, 0C5C1h, 0C481h, 00440h
// DW 0CC01h, 00CC0h, 00D80h, 0CD41h, 00F00h, 0CFC1h, 0CE81h, 00E40h
// DW 00A00h, 0CAC1h, 0CB81h, 00B40h, 0C901h, 009C0h, 00880h, 0C841h
// DW 0D801h, 018C0h, 01980h, 0D941h, 01B00h, 0DBC1h, 0DA81h, 01A40h
// DW 01E00h, 0DEC1h, 0DF81h, 01F40h, 0DD01h, 01DC0h, 01C80h, 0DC41h
// DW 01400h, 0D4C1h, 0D581h, 01540h, 0D701h, 017C0h, 01680h, 0D641h
// DW 0D201h, 012C0h, 01380h, 0D341h, 01100h, 0D1C1h, 0D081h, 01040h
// DW 0F001h, 030C0h, 03180h, 0F141h, 03300h, 0F3C1h, 0F281h, 03240h
// DW 03600h, 0F6C1h, 0F781h, 03740h, 0F501h, 035C0h, 03480h, 0F441h
// DW 03C00h, 0FCC1h, 0FD81h, 03D40h, 0FF01h, 03FC0h, 03E80h, 0FE41h
// DW 0FA01h, 03AC0h, 03B80h, 0FB41h, 03900h, 0F9C1h, 0F881h, 03840h
// DW 02800h, 0E8C1h, 0E981h, 02940h, 0EB01h, 02BC0h, 02A80h, 0EA41h
// DW 0EE01h, 02EC0h, 02F80h, 0EF41h, 02D00h, 0EDC1h, 0EC81h, 02C40h
// DW 0E401h, 024C0h, 02580h, 0E541h, 02700h, 0E7C1h, 0E681h, 02640h
// DW 02200h, 0E2C1h, 0E381h, 02340h, 0E101h, 021C0h, 02080h, 0E041h
// DW 0A001h, 060C0h, 06180h, 0A141h, 06300h, 0A3C1h, 0A281h, 06240h
// DW 06600h, 0A6C1h, 0A781h, 06740h, 0A501h, 065C0h, 06480h, 0A441h
// DW 06C00h, 0ACC1h, 0AD81h, 06D40h, 0AF01h, 06FC0h, 06E80h, 0AE41h
// DW 0AA01h, 06AC0h, 06B80h, 0AB41h, 06900h, 0A9C1h, 0A881h, 06840h
// DW 07800h, 0B8C1h, 0B981h, 07940h, 0BB01h, 07BC0h, 07A80h, 0BA41h
// DW 0BE01h, 07EC0h, 07F80h, 0BF41h, 07D00h, 0BDC1h, 0BC81h, 07C40h
// DW 0B401h, 074C0h, 07580h, 0B541h, 07700h, 0B7C1h, 0B681h, 07640h
// DW 07200h, 0B2C1h, 0B381h, 07340h, 0B101h, 071C0h, 07080h, 0B041h
// DW 05000h, 090C1h, 09181h, 05140h, 09301h, 053C0h, 05280h, 09241h
// DW 09601h, 056C0h, 05780h, 09741h, 05500h, 095C1h, 09481h, 05440h
// DW 09C01h, 05CC0h, 05D80h, 09D41h, 05F00h, 09FC1h, 09E81h, 05E40h
// DW 05A00h, 09AC1h, 09B81h, 05B40h, 09901h, 059C0h, 05880h, 09841h
// DW 08801h, 048C0h, 04980h, 08941h, 04B00h, 08BC1h, 08A81h, 04A40h
// DW 04E00h, 08EC1h, 08F81h, 04F40h, 08D01h, 04DC0h, 04C80h, 08C41h
// DW 04400h, 084C1h, 08581h, 04540h, 08701h, 047C0h, 04680h, 08641h
// DW 08201h, 042C0h, 04380h, 08341h, 04100h, 081C1h, 08081h, 04040h
@CRC16: DW 00000h, 01189h, 02312h, 0329bh, 04624h, 057adh, 06536h, 074bfh
DW 08c48h, 09dc1h, 0af5ah, 0bed3h, 0ca6ch, 0dbe5h, 0e97eh, 0f8f7h
DW 01081h, 00108h, 03393h, 0221ah, 056a5h, 0472ch, 075b7h, 0643eh
DW 09cc9h, 08d40h, 0bfdbh, 0ae52h, 0daedh, 0cb64h, 0f9ffh, 0e876h
DW 02102h, 0308bh, 00210h, 01399h, 06726h, 076afh, 04434h, 055bdh
DW 0ad4ah, 0bcc3h, 08e58h, 09fd1h, 0eb6eh, 0fae7h, 0c87ch, 0d9f5h
DW 03183h, 0200ah, 01291h, 00318h, 077a7h, 0662eh, 054b5h, 0453ch
DW 0bdcbh, 0ac42h, 09ed9h, 08f50h, 0fbefh, 0ea66h, 0d8fdh, 0c974h
DW 04204h, 0538dh, 06116h, 0709fh, 00420h, 015a9h, 02732h, 036bbh
DW 0ce4ch, 0dfc5h, 0ed5eh, 0fcd7h, 08868h, 099e1h, 0ab7ah, 0baf3h
DW 05285h, 0430ch, 07197h, 0601eh, 014a1h, 00528h, 037b3h, 0263ah
DW 0decdh, 0cf44h, 0fddfh, 0ec56h, 098e9h, 08960h, 0bbfbh, 0aa72h
DW 06306h, 0728fh, 04014h, 0519dh, 02522h, 034abh, 00630h, 017b9h
DW 0ef4eh, 0fec7h, 0cc5ch, 0ddd5h, 0a96ah, 0b8e3h, 08a78h, 09bf1h
DW 07387h, 0620eh, 05095h, 0411ch, 035a3h, 0242ah, 016b1h, 00738h
DW 0ffcfh, 0ee46h, 0dcddh, 0cd54h, 0b9ebh, 0a862h, 09af9h, 08b70h
DW 08408h, 09581h, 0a71ah, 0b693h, 0c22ch, 0d3a5h, 0e13eh, 0f0b7h
DW 00840h, 019c9h, 02b52h, 03adbh, 04e64h, 05fedh, 06d76h, 07cffh
DW 09489h, 08500h, 0b79bh, 0a612h, 0d2adh, 0c324h, 0f1bfh, 0e036h
DW 018c1h, 00948h, 03bd3h, 02a5ah, 05ee5h, 04f6ch, 07df7h, 06c7eh
DW 0a50ah, 0b483h, 08618h, 09791h, 0e32eh, 0f2a7h, 0c03ch, 0d1b5h
DW 02942h, 038cbh, 00a50h, 01bd9h, 06f66h, 07eefh, 04c74h, 05dfdh
DW 0b58bh, 0a402h, 09699h, 08710h, 0f3afh, 0e226h, 0d0bdh, 0c134h
DW 039c3h, 0284ah, 01ad1h, 00b58h, 07fe7h, 06e6eh, 05cf5h, 04d7ch
DW 0c60ch, 0d785h, 0e51eh, 0f497h, 08028h, 091a1h, 0a33ah, 0b2b3h
DW 04a44h, 05bcdh, 06956h, 078dfh, 00c60h, 01de9h, 02f72h, 03efbh
DW 0d68dh, 0c704h, 0f59fh, 0e416h, 090a9h, 08120h, 0b3bbh, 0a232h
DW 05ac5h, 04b4ch, 079d7h, 0685eh, 01ce1h, 00d68h, 03ff3h, 02e7ah
DW 0e70eh, 0f687h, 0c41ch, 0d595h, 0a12ah, 0b0a3h, 08238h, 093b1h
DW 06b46h, 07acfh, 04854h, 059ddh, 02d62h, 03cebh, 00e70h, 01ff9h
DW 0f78fh, 0e606h, 0d49dh, 0c514h, 0b1abh, 0a022h, 092b9h, 08330h
DW 07bc7h, 06a4eh, 058d5h, 0495ch, 03de3h, 02c6ah, 01ef1h, 00f78hend;
上面包括被注释掉的,总共是两份不同的CRC16字典,其中一份是CRC-CCITT算法的字典,具体不记得了。
function FILE_CRC_Cal(FileName: String): Word;
var
mem: TMemoryStream;
begin
Result := 0;//初始值
mem := TMemoryStream.Create;
try
mem.LoadFromFile(FileName(*文件名*));
Result := CRC16(Result, mem.Memory, mem.Size);
finally
mem.Free;
end;
end;