求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 30 31 46 43 0D 0A”。其中第一个为起始符,2-13为数据,14-15即“FC”为LRC校验码,有人能写一个取得校验位的函数吗? 下边有一段用VC写的程序 将帧的内容,除去头代码,用十六进制表示,求和,模FF,然后取补码,以ASCII码表示即可。 例如:ASCII帧 3A 30 31 30 32 30 30 30 30 30 30 30 31 46 43 0D 0A 将校验内容用十六进制表示为: 00 01 00 02 00 00 00 00 00 00 00 01 将以上数值用十六进制求和,模FF: 00+01+00+02+00+00+00+00+00+00+00+01=04=0000 0100 取反:1111 1011 加1: 1111 1100 十六进制变换:F C ASCII码:46 43 LRC就是这样算出来的这里有一段用C写的程序,有谁能用DELPHI写吗? static unsigned char LRC(auchMsg,usDataLen) unsigned char *auchMsg ; /* 要进行计算的消息 */ unsigned short usDataLen ; /* LRC 要处理的字节的数量*/ { unsigned char uchLRC = 0 ; /* LRC 字节初始化 */ while (usDataLen--) /* 传送消息 */ uchLRC += *auchMsg++ ; /* 累加*/ return ((unsigned char)(-((char_uchLRC))) ; } 解决方案 » cvm
function GetLRC(AData: array of Byte; iLen: Integer): Byte; var iLoop : Integer; begin Result := 0; for iLoop := 0 to iLen - 1 do Result := Result + AData[iLoop]; Result := Result xor $FF + 1; end;procedure TForm1.FormCreate(Sender: TObject); var AData: array[0..5] of Byte; iLRC : Byte; begin AData[0] := $01; AData[1] := $02; AData[2] := $00; AData[3] := $00; AData[4] := $00; AData[5] := $01; iLRC := GetLRC(AData, 6); ShowMessage(IntToHex(iLRC,2)); end;
再多加个函数,可以直接获取类似楼主例子中的"010200000001FC"这个字符串: function GetLRC(AData: array of Byte; iLen: Integer): Byte; var iLoop : Integer; begin Result := 0; for iLoop := 0 to iLen - 1 do Result := Result + AData[iLoop]; Result := Result xor $FF + 1; end;function GetHexString(AData: array of Byte; iLen: Integer): String; var iLoop: Integer; begin Result := ''; for iLoop := 0 to iLen - 1 do Result := Result + IntToHex(AData[iLoop], 2); Result := Result + IntToHex(GetLRC(AData, iLen), 2); end;procedure TForm1.FormCreate(Sender: TObject); var AData: array[0..5] of Byte; begin AData[0] := $01; AData[1] := $02; AData[2] := $00; AData[3] := $00; AData[4] := $00; AData[5] := $01; ShowMessage(GetHexString(AData, 6)); end;
static byte LRC(byte[] data) { byte lrc = 0; foreach (byte c in data) { lrc += c; } return (byte)-lrc; }
|
请发表评论