unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SPComm;type
    //CRC的数据结构
   TMyCRC = record                                   //position
              Lowbyte:byte;                                     //1
              Highbyte:byte;                                 //2
         end;
  TForm1 = class(TForm)
   Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Comm1: TComm;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { Public declarations }
  end;
Const
      CRCL:array   [0..255]   of   byte=(
                  $00,$21,$42,$63,$84,$A5,$C6,$E7,$08,$29,$4A,$6B,$8C,$AD,$CE,$EF,
                  $31,$10,$73,$52,$B5,$94,$F7,$D6,$39,$18,$7B,$5A,$BD,$9C,$FF,$DE,
                  $62,$43,$20,$01,$E6,$C7,$A4,$85,$6A,$4B,$28,$09,$EE,$CF,$AC,$8D,
                  $53,$72,$11,$30,$D7,$F6,$95,$B4,$5B,$7A,$19,$38,$DF,$FE,$9D,$BC,
                  $C4,$E5,$86,$A7,$40,$61,$02,$23,$CC,$ED,$8E,$AF,$48,$69,$0A,$2B,
                  $F5,$D4,$B7,$96,$71,$50,$33,$12,$FD,$DC,$BF,$9E,$79,$58,$3B,$1A,
                  $A6,$87,$E4,$C5,$22,$03,$60,$41,$AE,$8F,$EC,$CD,$2A,$0B,$68,$49,
                  $97,$B6,$D5,$F4,$13,$32,$51,$70,$9F,$BE,$DD,$FC,$1B,$3A,$59,$78,
                  $88,$A9,$CA,$EB,$0C,$2D,$4E,$6F,$80,$A1,$C2,$E3,$04,$25,$46,$67,
                  $B9,$98,$FB,$DA,$3D,$1C,$7F,$5E,$B1,$90,$F3,$D2,$35,$14,$77,$56,
                  $EA,$CB,$A8,$89,$6E,$4F,$2C,$0D,$E2,$C3,$A0,$81,$66,$47,$24,$05,
                  $DB,$FA,$99,$B8,$5F,$7E,$1D,$3C,$D3,$F2,$91,$B0,$57,$76,$15,$34,
                  $4C,$6D,$0E,$2F,$C8,$E9,$8A,$AB,$44,$65,$06,$27,$C0,$E1,$82,$A3,
                  $7D,$5C,$3F,$1E,$F9,$D8,$BB,$9A,$75,$54,$37,$16,$F1,$D0,$B3,$92,
                  $2E,$0F,$6C,$4D,$AA,$8B,$E8,$C9,$26,$07,$64,$45,$A2,$83,$E0,$C1,
                  $1F,$3E,$5D,$7C,$9B,$BA,$D9,$F8,$17,$36,$55,$74,$93,$B2,$D1,$F0);      CRCH:array   [0..255]   of   byte=(
                  $00,$10,$20,$30,$40,$50,$60,$70,$81,$91,$A1,$B1,$C1,$D1,$E1,$F1,
                  $12,$02,$32,$22,$52,$42,$72,$62,$93,$83,$B3,$A3,$D3,$C3,$F3,$E3,
                  $24,$34,$04,$14,$64,$74,$44,$54,$A5,$B5,$85,$95,$E5,$F5,$C5,$D5,
                  $36,$26,$16,$06,$76,$66,$56,$46,$B7,$A7,$97,$87,$F7,$E7,$D7,$C7,
                  $48,$58,$68,$78,$08,$18,$28,$38,$C9,$D9,$E9,$F9,$89,$99,$A9,$B9,
                  $5A,$4A,$7A,$6A,$1A,$0A,$3A,$2A,$DB,$CB,$FB,$EB,$9B,$8B,$BB,$AB,
                  $6C,$7C,$4C,$5C,$2C,$3C,$0C,$1C,$ED,$FD,$CD,$DD,$AD,$BD,$8D,$9D,
                  $7E,$6E,$5E,$4E,$3E,$2E,$1E,$0E,$FF,$EF,$DF,$CF,$BF,$AF,$9F,$8F,
                  $91,$81,$B1,$A1,$D1,$C1,$F1,$E1,$10,$00,$30,$20,$50,$40,$70,$60,
                  $83,$93,$A3,$B3,$C3,$D3,$E3,$F3,$02,$12,$22,$32,$42,$52,$62,$72,
                  $B5,$A5,$95,$85,$F5,$E5,$D5,$C5,$34,$24,$14,$04,$74,$64,$54,$44,
                  $A7,$B7,$87,$97,$E7,$F7,$C7,$D7,$26,$36,$06,$16,$66,$76,$46,$56,
                  $D9,$C9,$F9,$E9,$99,$89,$B9,$A9,$58,$48,$78,$68,$18,$08,$38,$28,
                  $CB,$DB,$EB,$FB,$8B,$9B,$AB,$BB,$4A,$5A,$6A,$7A,$0A,$1A,$2A,$3A,
                  $FD,$ED,$DD,$CD,$BD,$AD,$9D,$8D,$7C,$6C,$5C,$4C,$3C,$2C,$1C,$0C,
                  $EF,$FF,$CF,$DF,$AF,$BF,$8F,$9F,$6E,$7E,$4E,$5E,$2E,$3E,$0E,$1E);var
  Form1: TForm1;crc:char;
  Charx1:string;
  Function   BuffCalCulateCRC(InputBuff:Pchar;BuffLen:integer):TMyCRC;//计算CRCimplementation{$R *.dfm}
 //计算长度为BuffLen,下标从0开始的数组的CRC校验值
  Function   BuffCalCulateCRC(InputBuff:Pchar;BuffLen:integer):TMyCRC;//计算CRC
  var
      i,j:integer;
      Charx:array[0..1023]   of   char;
      btt1,Btmp:byte;
      T1,T2,T3:byte;
      Rt:TMyCRC;
  begin
      for   j:=0   to   Bufflen-1   do   begin
          charx[j]:=inputBuff[j];
      end;
      charx[BuffLen]:=#0;
      Charx[BuffLen+1]:=#0;      T1:=byte(charx[0]);
      T2:=byte(charx[1]);
      for     i:=2   to   Bufflen+1     do   begin
          T3:=byte(charx[i]);
          Btmp:=T1;
          Btt1:=CRCH[Btmp];
          T1:=Btt1   Xor   T2;
          Btt1:=CRCL[Btmp];
          T2:=Btt1   xor   T3;
      end;
  //     Result:=(T1   shl   8)   +T2;
      Rt.Highbyte:=T1;
      Rt.Lowbyte:=T2;
      Result:=Rt;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var
Charx2:array[0..1023]   of   char;
Charx1:string;
Rt:TMyCRC;
i:integer;
pcharx2:pchar;
begin
edit1.Text:='';
Charx1:=edit1.Text;
copyMemory(@Charx2,pchar(Charx1),Length(Charx1));
{for   i:=0   to   i-1   do   begin
          charx2[i]:=inputBuff[i];
      end; }
pcharx2:=charx2;
BuffCalCulateCRC(pCharx2;1);
form1.Memo1.Lines.Add(Rt);
form1.Memo1.Lines.Add('');
end;end.
上面的代码里有个函数是CRC16校验函数,在论坛里找到的!
小弟现在想实现在一个FORM上的EDIT输入一个数组,然后按钮触发对其进行CRC校验,然后在memo中显示,但是现在BuffCalCulateCRC(pCharx2;1);总出问题,说参量不够!
说白了我就是不明白调用Function   BuffCalCulateCRC(InputBuff:Pchar;BuffLen:integer):TMyCRC;时怎么指派参量,
各位大哥帮帮我这个菜鸟,着急啊,想了两天了!
先谢谢各位了!

解决方案 »

  1.   

    BuffCalCulateCRC(pCharx2;1);
                            |--------不对
      

  2.   


    BuffCalCulateCRC(pCharx2         ;----(,)         1);
      

  3.   

    我试过用逗号,不好使!
    现在就是函数调用时的变量指定的格式不对!
    我想在edit里输入表示数组的字符串,然后对输入的数组调用这个校验函数,得怎么写变量呢?
      

  4.   

    form1.Memo1.Lines.Add(Rt);//---能这样加一个记录类型到一个MEMO里吗? - -!
    form1.Memo1.Lines.Add('');
      

  5.   

    (mc: TMyCRC)
    mc = BuffCalCulateCRC(pchar(edit1.text), length(edit1.text));
      

  6.   

    多谢各位的帮助,现在还有个关键问题,就是我想把结果显示在窗体上,正如上面的兄弟说的,memo显示得是STR型,那Record用什么控件显示?基本的语句是什么那?
    问题较多,大家帮帮忙,谢谢了!
      

  7.   

    (str:string)
    setlength(str, 2);
    str[1] = chr(mc.Lowbyte);
    str[2] = chr(mc.Highbyte);
    edit1.text := str;
      

  8.   

    现在代码变成下面这样
    unit Pcrc;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
       //CRC的数据结构
       TMyCRC = record                                   //position
                  Lowbyte:byte;                                     //1
                  Highbyte:byte;                                 //2
             end;
      TForm1 = class(TForm)
        Edit1: TEdit;
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    Const
          CRCL:array   [0..255]   of   byte=(
                      $00,$21,$42,$63,$84,$A5,$C6,$E7,$08,$29,$4A,$6B,$8C,$AD,$CE,$EF,
                      $31,$10,$73,$52,$B5,$94,$F7,$D6,$39,$18,$7B,$5A,$BD,$9C,$FF,$DE,
                      $62,$43,$20,$01,$E6,$C7,$A4,$85,$6A,$4B,$28,$09,$EE,$CF,$AC,$8D,
                      $53,$72,$11,$30,$D7,$F6,$95,$B4,$5B,$7A,$19,$38,$DF,$FE,$9D,$BC,
                      $C4,$E5,$86,$A7,$40,$61,$02,$23,$CC,$ED,$8E,$AF,$48,$69,$0A,$2B,
                      $F5,$D4,$B7,$96,$71,$50,$33,$12,$FD,$DC,$BF,$9E,$79,$58,$3B,$1A,
                      $A6,$87,$E4,$C5,$22,$03,$60,$41,$AE,$8F,$EC,$CD,$2A,$0B,$68,$49,
                      $97,$B6,$D5,$F4,$13,$32,$51,$70,$9F,$BE,$DD,$FC,$1B,$3A,$59,$78,
                      $88,$A9,$CA,$EB,$0C,$2D,$4E,$6F,$80,$A1,$C2,$E3,$04,$25,$46,$67,
                      $B9,$98,$FB,$DA,$3D,$1C,$7F,$5E,$B1,$90,$F3,$D2,$35,$14,$77,$56,
                      $EA,$CB,$A8,$89,$6E,$4F,$2C,$0D,$E2,$C3,$A0,$81,$66,$47,$24,$05,
                      $DB,$FA,$99,$B8,$5F,$7E,$1D,$3C,$D3,$F2,$91,$B0,$57,$76,$15,$34,
                      $4C,$6D,$0E,$2F,$C8,$E9,$8A,$AB,$44,$65,$06,$27,$C0,$E1,$82,$A3,
                      $7D,$5C,$3F,$1E,$F9,$D8,$BB,$9A,$75,$54,$37,$16,$F1,$D0,$B3,$92,
                      $2E,$0F,$6C,$4D,$AA,$8B,$E8,$C9,$26,$07,$64,$45,$A2,$83,$E0,$C1,
                      $1F,$3E,$5D,$7C,$9B,$BA,$D9,$F8,$17,$36,$55,$74,$93,$B2,$D1,$F0);      CRCH:array   [0..255]   of   byte=(
                      $00,$10,$20,$30,$40,$50,$60,$70,$81,$91,$A1,$B1,$C1,$D1,$E1,$F1,
                      $12,$02,$32,$22,$52,$42,$72,$62,$93,$83,$B3,$A3,$D3,$C3,$F3,$E3,
                      $24,$34,$04,$14,$64,$74,$44,$54,$A5,$B5,$85,$95,$E5,$F5,$C5,$D5,
                      $36,$26,$16,$06,$76,$66,$56,$46,$B7,$A7,$97,$87,$F7,$E7,$D7,$C7,
                      $48,$58,$68,$78,$08,$18,$28,$38,$C9,$D9,$E9,$F9,$89,$99,$A9,$B9,
                      $5A,$4A,$7A,$6A,$1A,$0A,$3A,$2A,$DB,$CB,$FB,$EB,$9B,$8B,$BB,$AB,
                      $6C,$7C,$4C,$5C,$2C,$3C,$0C,$1C,$ED,$FD,$CD,$DD,$AD,$BD,$8D,$9D,
                      $7E,$6E,$5E,$4E,$3E,$2E,$1E,$0E,$FF,$EF,$DF,$CF,$BF,$AF,$9F,$8F,
                      $91,$81,$B1,$A1,$D1,$C1,$F1,$E1,$10,$00,$30,$20,$50,$40,$70,$60,
                      $83,$93,$A3,$B3,$C3,$D3,$E3,$F3,$02,$12,$22,$32,$42,$52,$62,$72,
                      $B5,$A5,$95,$85,$F5,$E5,$D5,$C5,$34,$24,$14,$04,$74,$64,$54,$44,
                      $A7,$B7,$87,$97,$E7,$F7,$C7,$D7,$26,$36,$06,$16,$66,$76,$46,$56,
                      $D9,$C9,$F9,$E9,$99,$89,$B9,$A9,$58,$48,$78,$68,$18,$08,$38,$28,
                      $CB,$DB,$EB,$FB,$8B,$9B,$AB,$BB,$4A,$5A,$6A,$7A,$0A,$1A,$2A,$3A,
                      $FD,$ED,$DD,$CD,$BD,$AD,$9D,$8D,$7C,$6C,$5C,$4C,$3C,$2C,$1C,$0C,
                      $EF,$FF,$CF,$DF,$AF,$BF,$8F,$9F,$6E,$7E,$4E,$5E,$2E,$3E,$0E,$1E);var
      Form1: TForm1;
      crc:char;
      Charx1:string;
       Function   BuffCalCulateCRC(InputBuff:Pchar;BuffLen:integer):TMyCRC;//计算CRC
    implementation{$R *.dfm}//计算长度为BuffLen,下标从0开始的数组的CRC校验值
      Function   BuffCalCulateCRC(InputBuff:Pchar;BuffLen:integer):TMyCRC;//计算CRC
      var
          i,j:integer;
          Charx:array[0..100]   of   char;
          btt1,Btmp:byte;
          T1,T2,T3:byte;
          Rt:TMyCRC;
      begin
          for   j:=0   to   Bufflen-1   do   begin
              charx[j]:=inputBuff[j];
          end;
          charx[BuffLen]:=#0;
          Charx[BuffLen+1]:=#0;      T1:=byte(charx[0]);
          T2:=byte(charx[1]);
          for     i:=2   to   Bufflen+1     do   begin
              T3:=byte(charx[i]);
              Btmp:=T1;
              Btt1:=CRCH[Btmp];
              T1:=Btt1   Xor   T2;
              Btt1:=CRCL[Btmp];
              T2:=Btt1   xor   T3;
          end;
      //     Result:=(T1   shl   8)   +T2;
          Rt.Highbyte:=T1;
          Rt.Lowbyte:=T2;
          Result:=Rt;
      end;
      
    procedure TForm1.Button1Click(Sender: TObject);
    //type Dataptr=^Charx1; end;
    var
    {Charx1:string; }
    Charx1:array[0..2] of char;
    Charx2:integer;
    str,str1:string;
    mc:TMyCRC;
    begin
    {Charx1:=edit1.Text;}
    setlength(str1,3);
    str1:=edit1.Text;
    Charx1[0]:=str1[1];
    Charx1[1]:=str1[2];
    Charx1[2]:=str1[3];
    mc:=BuffCalCulateCRC(pchar(@Charx1),length(Charx1));
    setlength(str, 2);
    str[1]:= chr(mc.Highbyte);
    str[2]:= chr(mc.Lowbyte);
    form1.Memo1.Lines.Add(str[1]+ str[2]);
    form1.Memo1.Lines.Add('');
    end;end.
    能够编译过去,但是显示的校验码不对,已经弄了好几天了,就是弄不明白,着急中,大哥们帮帮忙吧,不胜感激!