文件的内容用crc16效验了,如何通过文件内容知道效验码?
文件内容为2进制数据,采用CRC-CCITT: G(D)=D16+D12+D5+1方式效验,如何通过文件内容获得效验码呢?
[解决办法]
有难度,帮up
[解决办法]
这个不能获得效验码吧,除非你自己用算法去算
[解决办法]
有点麻烦。
求高手吧
[解决办法]
不懂 帮顶
[解决办法]
有CRC校验的函数,不过如果算大文件,需要的时间比较长。
[解决办法]
[解决办法]
给你一个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;