在Fastreport里使用的CRC函数

如标题, 是在Fastreport的脚本里运行的CRC计算函数, 包括CRC-16/CRC-32

基本是从网上找的代码, 然后改出来的

至于为什么要在FR的脚本里运行....呵呵 不要在意这些细节(找产品经理去...)

问题点:

1.FR脚本支持的系统函数有限, 比如不支持move

2.支持的数据类型有限, 比如不支持Dword/int64等

3.支持的语法有限, 比如不支持const 静态数组...

都是泪......

不多说, 直接贴代码

补充下, CRC-16用的是MODBUS算法

 

CRC-16

function CRC16_MODBUS(const buf: array of byte;len: Integer): Word;
var
  i, j: Integer;
  chr: Word;
begin
  Result := $ffff;
  for j:=0 to len-1 do
  begin
    chr := buf[j] and $ff;
    Result := Result xor chr;
    for i:=0 to 8 -1 do 
    begin
      if ((Result and 01)<>0) then
        Result := (Result shr 1) xor $a001
      else
        Result := Result shr 1;
    end;
    Result := Result and $ffff;
  end;
end;

function CRC16Str(str: string): Word;
var
  arrStr: array of Byte;
  i: integer;
begin
  SetLength(arrStr, Length(str));
  for i := 0 to Length(arrStr) - 1 do
    arrStr[i] := Ord(str[i + 1]);
  Result := CRC16_MODBUS(arrStr, Length(arrStr));
end;

 

CRC-32

procedure CRC32(AStr: string; var ACRC32: Cardinal);
var
  lCRC32Table: array[0..255] of Cardinal;
  i, lBufLen: integer;
begin
  lCRC32Table := [                              
    $00000000,   $77073096,   $EE0E612C,   $990951BA,
    $076DC419,   $706AF48F,   $E963A535,   $9E6495A3,
    $0EDB8832,   $79DCB8A4,   $E0D5E91E,   $97D2D988,
    $09B64C2B,   $7EB17CBD,   $E7B82D07,   $90BF1D91,
    $1DB71064,   $6AB020F2,   $F3B97148,   $84BE41DE,
    $1ADAD47D,   $6DDDE4EB,   $F4D4B551,   $83D385C7,
    $136C9856,   $646BA8C0,   $FD62F97A,   $8A65C9EC,
    $14015C4F,   $63066CD9,   $FA0F3D63,   $8D080DF5,
    $3B6E20C8,   $4C69105E,   $D56041E4,   $A2677172,
    $3C03E4D1,   $4B04D447,   $D20D85FD,   $A50AB56B,
    $35B5A8FA,   $42B2986C,   $DBBBC9D6,   $ACBCF940,
    $32D86CE3,   $45DF5C75,   $DCD60DCF,   $ABD13D59,
    $26D930AC,   $51DE003A,   $C8D75180,   $BFD06116,
    $21B4F4B5,   $56B3C423,   $CFBA9599,   $B8BDA50F,
    $2802B89E,   $5F058808,   $C60CD9B2,   $B10BE924,
    $2F6F7C87,   $58684C11,   $C1611DAB,   $B6662D3D,
    $76DC4190,   $01DB7106,   $98D220BC,   $EFD5102A,
    $71B18589,   $06B6B51F,   $9FBFE4A5,   $E8B8D433,
    $7807C9A2,   $0F00F934,   $9609A88E,   $E10E9818,
    $7F6A0DBB,   $086D3D2D,   $91646C97,   $E6635C01,
    $6B6B51F4,   $1C6C6162,   $856530D8,   $F262004E,
    $6C0695ED,   $1B01A57B,   $8208F4C1,   $F50FC457,
    $65B0D9C6,   $12B7E950,   $8BBEB8EA,   $FCB9887C,
    $62DD1DDF,   $15DA2D49,   $8CD37CF3,   $FBD44C65,
    $4DB26158,   $3AB551CE,   $A3BC0074,   $D4BB30E2,
    $4ADFA541,   $3DD895D7,   $A4D1C46D,   $D3D6F4FB,
    $4369E96A,   $346ED9FC,   $AD678846,   $DA60B8D0,
    $44042D73,   $33031DE5,   $AA0A4C5F,   $DD0D7CC9,
    $5005713C,   $270241AA,   $BE0B1010,   $C90C2086,
    $5768B525,   $206F85B3,   $B966D409,   $CE61E49F,
    $5EDEF90E,   $29D9C998,   $B0D09822,   $C7D7A8B4,
    $59B33D17,   $2EB40D81,   $B7BD5C3B,   $C0BA6CAD,
    $EDB88320,   $9ABFB3B6,   $03B6E20C,   $74B1D29A,
    $EAD54739,   $9DD277AF,   $04DB2615,   $73DC1683,
    $E3630B12,   $94643B84,   $0D6D6A3E,   $7A6A5AA8,
    $E40ECF0B,   $9309FF9D,   $0A00AE27,   $7D079EB1,
    $F00F9344,   $8708A3D2,   $1E01F268,   $6906C2FE,
    $F762575D,   $806567CB,   $196C3671,   $6E6B06E7,
    $FED41B76,   $89D32BE0,   $10DA7A5A,   $67DD4ACC,
    $F9B9DF6F,   $8EBEEFF9,   $17B7BE43,   $60B08ED5,
    $D6D6A3E8,   $A1D1937E,   $38D8C2C4,   $4FDFF252,
    $D1BB67F1,   $A6BC5767,   $3FB506DD,   $48B2364B,
    $D80D2BDA,   $AF0A1B4C,   $36034AF6,   $41047A60,
    $DF60EFC3,   $A867DF55,   $316E8EEF,   $4669BE79,
    $CB61B38C,   $BC66831A,   $256FD2A0,   $5268E236,
    $CC0C7795,   $BB0B4703,   $220216B9,   $5505262F,
    $C5BA3BBE,   $B2BD0B28,   $2BB45A92,   $5CB36A04,
    $C2D7FFA7,   $B5D0CF31,   $2CD99E8B,   $5BDEAE1D,
    $9B64C2B0,   $EC63F226,   $756AA39C,   $026D930A,
    $9C0906A9,   $EB0E363F,   $72076785,   $05005713,
    $95BF4A82,   $E2B87A14,   $7BB12BAE,   $0CB61B38,
    $92D28E9B,   $E5D5BE0D,   $7CDCEFB7,   $0BDBDF21,
    $86D3D2D4,   $F1D4E242,   $68DDB3F8,   $1FDA836E,
    $81BE16CD,   $F6B9265B,   $6FB077E1,   $18B74777,
    $88085AE6,   $FF0F6A70,   $66063BCA,   $11010B5C,
    $8F659EFF,   $F862AE69,   $616BFFD3,   $166CCF45,
    $A00AE278,   $D70DD2EE,   $4E048354,   $3903B3C2,
    $A7672661,   $D06016F7,   $4969474D,   $3E6E77DB,
    $AED16A4A,   $D9D65ADC,   $40DF0B66,   $37D83BF0,
    $A9BCAE53,   $DEBB9EC5,   $47B2CF7F,   $30B5FFE9,
    $BDBDF21C,   $CABAC28A,   $53B39330,   $24B4A3A6,
    $BAD03605,   $CDD70693,   $54DE5729,   $23D967BF,
    $B3667A2E,   $C4614AB8,   $5D681B02,   $2A6F2B94,
    $B40BBE37,   $C30C8EA1,   $5A05DF1B,   $2D02EF8D
  ];
  lBufLen := Length(AStr);
  ACRC32 := $FFFFFFFF;
  for i := 1 to lBufLen do
    ACRC32 := (ACRC32 shr 8) xor lCRC32Table[Ord(AStr[i]) xor (ACRC32 and $000000FF)];
  ACRC32 := (not ACRC32) and $FFFFFFFF;  //一定要 and $FFFFFFFF 否则会提示类型不正确 -_-                                                                      
end;

 

posted on 2019-04-29 13:03  黑暗煎饼果子  阅读(540)  评论(0编辑  收藏  举报