文件内容为2进制数据,采用CRC-CCITT: G(D)=D16+D12+D5+1方式效验,如何通过文件内容获得效验码呢?

解决方案 »

  1.   

    有CRC校验的函数,不过如果算大文件,需要的时间比较长。
      

  2.   


    为什么得不到呢?效验方式知道啊CRC-CCITT: G(D)=D16+D12+D5+1
      

  3.   

    给你一个CRC校验的函数:
    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.
      

  4.   

    楼上这位大哥,我需要的是CRC-CCITT的,不是crc32的
      

  5.   

    CRC-CCITT不知道算法是什么样的?
      

  6.   

    function CRC16(CRC: Word; Data: Pointer; DataSize: LongWord): Word; assembler;
    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算法的字典,具体不记得了。
      

  7.   

    小文件示例:
    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;