/**CRC16算法实现 
  * 参数 buf 为 CRC16的数据源 
  * return 为CRC16的结果(只对16位有效) 
  */ 
public static int mjComCRC(byte buf[]) { 
  int len = buf.length; 
  int crc,chr,i,j; 
  crc = 0xffff; 
  for(j=0; j <len; ++j){ 
      chr = buf[j] & 0xff; 
      crc ^= chr; 
      for(i=0;i <8;i++) { 
          if ((crc & 01)!=0) 
              crc = (crc>>1)^0xa001; 
          else 
              crc = crc>>1; 
      } 
      crc &= 0xffff; 
  } 
  return crc; 

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type  TArray = array of byte;  // 定义动态数组  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;function mjComCRC(buf: TArray): integer;  // 公共函数var
      Form1: TForm1;implementationfunction mjComCRC(buf: TArray): integer;  // 计算 crc
    var
      crc, chr, i, j: integer;
    begin
      crc := $ffff;
      for j := Low(buf) to High(buf) do begin  // 不需要长度变量 len
        chr := buf[j] and $ff;
        crc := crc xor chr;
        for i := 0 to 7 do begin
          if (crc and 01) <> 0 then
            crc := (crc shr 1) xor $a001
          else
            crc := crc shr 1;
          crc := crc and $ffff;
        end;
      end;
      Result := crc;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       a: TArray;
       n, i: integer;
    begin
      SetLength(a, 10);  // 设置动态数组
      for i := Low(a) to High(a) do
        a[i] := i;  n := mjComCRC(a);  // 测试
      showmessage(inttostr(n));
    end;end.
      

  2.   

    对操作符号或数值:
    0xffff  $ffff   十六进指
    &       and     位与
    ^       xor     位异或
    >>      shr     右移位
    复合运算符:a += b 等价 a := a + b
    错了一个地方 crc := $ffff;
      for j := Low(buf) to High(buf) do begin  // 不需要长度变量 len
        chr := buf[j] and $ff;
        crc := crc xor chr;
        for i := 0 to 7 do begin
          if (crc and 01) <> 0 then
            crc := (crc shr 1) xor $a001
          else
            crc := crc shr 1;
        end;
        crc := crc and $ffff;  // 外循环
      end;
      Result := crc;
      

  3.   

    function Tform1.mjComCRC(buf: Array of byte): byte;  // 计算 crc
    var
      crc, chr, i, j: integer;
    begin
     crc := $ffff;
      for j := Low(buf) to High(buf) do begin  // 不需要长度变量 len
        chr := buf[j] and $ff;
        crc := crc xor chr;
        for i := 0 to 7 do begin
          if (crc and 01) <> 0 then
            crc := (crc shr 1) xor $a001
          else
            crc := crc shr 1;
        end;
        crc := crc and $ffff;  // 外循环
      end;
      Result := crc;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
       a: array of byte;
       n, i: integer;
    begin
      SetLength(a, 10);  // 设置动态数组
      for i := Low(a) to High(a) do
        a[i] := i;
        n := mjComCRC(a);  // 测试
        showmessage(inttostr(n));
    end;
    =====================================
    问题一:
    我把你那个动态数组  TArray = array of byte; 不要  buf: Array of byte
      a: array of byte;
    改了这俩地方可以吗????????????问题二:
    a 怎么赋值
    只能 a[0]:=ff;
        a[1]:=0a;
        a[2]:=ca;
    可不可以一次性的赋值呢?问题三:
    我想在一个Edit.text内输入 ff 0a ca,这样直接赋值给a,如何做呢?
      

  4.   

    1)在函数里不能有array of byte形式
    2)在产生a时给值
    3)Edit1.Text 有 ff 0a ca,先要转换为数组,然后