首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

文件的内容用crc16效验了,怎么通过文件内容知道效验码

2012-03-01 
文件的内容用crc16效验了,如何通过文件内容知道效验码?文件内容为2进制数据,采用CRC-CCITT: G(D)D16+D12+

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

[解决办法]
有难度,帮up
[解决办法]
这个不能获得效验码吧,除非你自己用算法去算
[解决办法]
有点麻烦。
求高手吧
[解决办法]
不懂 帮顶
[解决办法]
有CRC校验的函数,不过如果算大文件,需要的时间比较长。
[解决办法]

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

[解决办法]
给你一个CRC校验的函数:
unit Crc32;

interface

{$I VCheck.inc}

{$R-,Q-}

function UpdateCrc32(InitCRC: LongInt; const InBuf; InLen: Integer): LongInt;

implementation

const
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
pushebx
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
popebx
@@done:
{$ENDIF}
end{$IFDEF V_FREEPASCAL} ['eax','ecx','edx']{$ENDIF};
{$ENDIF}

end.
[解决办法]
你这个问题问的太有水平了,知道用什么校验还不知道结果。。
[解决办法]
CRC-CCITT不知道算法是什么样的?
[解决办法]

Delphi(Pascal) code
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, 00f78h

end;


上面包括被注释掉的,总共是两份不同的CRC16字典,其中一份是CRC-CCITT算法的字典,具体不记得了。
[解决办法]
小文件示例:
Delphi(Pascal) code
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; 

热点排行