海底漫步不进水的原理:解释一下这些DELPHI代码.

来源:百度文库 编辑:神马品牌网 时间:2024/05/02 20:22:35
procedure TForm1.SendHex(S: String);
var
s2:string;
buf1:array[0..50000] of char;
i:integer;
begin
s2:='';
for i:=1 to length(s) do
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
begin
s2:=s2+copy(s,i,1);
end;
end;
for i:=0 to (length(s2) div 2-1) do
buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));
Comm1.WriteCommData(buf1,(length(s2) div 2));
end;

请详细解释,还有追加分.

知识准备:
1、Copy函数:将源字符串(S)从指定下标(Index)处开始,拷贝长度为Count的子串,并返回该子串。
function Copy(S; Index, Count: Integer): string;
function Copy(S; Index, Count: Integer): array;
举个例子说吧:S:='abcdefg'; sR:=Copy(S,2,3) 那sR得到的值为——sR:='bcd'不要困惑,delphi字符串下标是从1开始的,C/C++是从0开始的。
2、delphi里的十六进制数表示:
如:0F800H,delphi里表示为$F800; C/C++里表示为0xF800.
3、Comm1.WriteCommData(buff,length);
这是从串口发送数据的函数。(你用到了第三方包中提供的串口操作包)
这个函数是讲,从串口发送buff从头算长度为length个字节。
-----------------------------------------------------
for i:=1 to length(s) do //length(s),得到S的长度
begin
if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))or((copy(s,i,1)>='a') and (copy(s,i,1)<='f'))
or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
//S[i]是否为十六进制数。0~f,即0~9,a~f。()其实我认为,也应该把大写字母A~F考虑进去。
begin
s2:=s2+copy(s,i,1);//将符合十六进制规范的表示存入S2
end;
end;
上面这段代码,是从S中过滤掉了那些不属于十六进制规范的表示。
如:S为'8f9d04g5dh',经过滤就得到了'8f9d045d'(g、h被过滤)
----------------------------------------------------------
for i:=0 to (length(s2) div 2-1) do
buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));
显然,每两个十六进制数为一个字节,如$8f为一个字节;$8为4bit;$ffff为一个字,$ffffffff为一个双字,即32位.
在串口传输时,是按字节来传的,所以要除2,因为i从0开始,所以除2减1。
上面这部份代即将过滤好的十六进制字符串按字节转换成数值存入buf1。
如:S2:='8f9d045d',buf1[0]:=$8f,buf1[1]:=$9d,buf1[2]:=$04,
buf1[3]:=$5d.
-------------------------------------------------------
Comm1.WriteCommData(buf1,(length(s2) div 2));
从串口发出去了~~~
-------------------------------------------------------
不知道我有没有说清楚,希望楼主可以理解!

输出字符串中符合16位进制的字符.