用的是function crc16(s: string; len: integer): string; 这个校验函数。
crc16('11232',5),这样调用是没问题。
但是我的数据段是有字母的,把字母加进去就报错了,比如变量S为'ST=32;CN=2011;PW=123456;MN=88888880000001;CP=&&&&';
调用运行到时候就出错了,请问有字母的CRC校验该如何校验的?
谢谢了

解决方案 »

  1.   

    crc16 函数有问题吧。
    估计里面的写法有问题,把每个字符都转换成数字来计算的。
      

  2.   

    你用的是16为的CRC吧
    应该是CRC函数有问题
    你debug的时候进入函数里面看看
    看看是哪个地方有问题 
      

  3.   

    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
             NOP
    @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
    end;
    S := 'ST=32;CN=2011;PW=123456;MN=88888880000001;CP=&&&&';
    ShowMessage(IntToHex(CRC16($ffff,PChar(S),Length(S)),4));
      

  4.   

    谢谢楼上的兄弟哈,你那个是可以算字母的CRC
    现在还有一个问题,就是如果我有QN=TIME,这个TIME是个变量,随着系统时间变化
    想把QN=TIME;ST=32;CN=2011;PW=123456;MN=88888880000001;CP=&&&&  一起进行CRC校验,请问有什么办法没?
      

  5.   

    TIME已经转换成STRING了S := 'QN=TIME;ST=32;CN=2011;PW=123456;MN=88888880000001;CP=&&&&';
    ShowMessage(IntToHex(CRC16($ffff,PChar(S),Length(S)),4));
    这样是不行的改成不知道可不可以,
    S:='QN='+TIME+';ST=32;CN=2011;PW=123456;MN=88888880000001;CP=&&&&';
    ShowMessage(IntToHex(CRC16($ffff,PChar(S),Length(S)),4));