刚刚学D,做了个简单的上位机,现在有个问题,数据接收来时都是ASCII码显示的,就像这样的3A        30 43       30 33        31 36               30 30 30 30 30 30 30 30       30 30 30 30 30 30 30 30         
开始:从机地址 功能代码    返回的字节个数                   数据1                                   数据2
 30 30 30 30 30 30 30 30     30 30 44 39       30 30 30 30      30 30 30 30        30 30 30 30       30 30 30 30     30 32    0D  0A
                 数据3                         数据4                  数据5                   数据6              数据7                   数据8       校验码   CR  LF
现在想把上面的数据的某个数据比如数据4截取出来显示在Edit框中,以十进制的形式显示数据,该如何实现呢,望大家帮帮忙呀,小弟在此谢了!!

解决方案 »

  1.   

    //============================================================================== 
    //字符串转换为十六进制字符串:例如‘ABCD’-> ‘41424344’************************* 
    //============================================================================== 
    function   BinaryToHexStr(Str:string):string; 
    var   i:   integer; 
    begin 
        Result   :=   ' '; 
        for   i:=1   to   Length(Str)   do   Result   :=   Result   +   IntToHex(Ord(Str[i]),2); 
    end; //============================================================================== 
    //十六进制字符串转换为字符串:例如‘41424344’-> ‘ABCD’************************* 
    //============================================================================== 
    function   HexStrToBinary(Str:string):string; 
    var   i,   Len:   integer; 
            Point:   Pointer; 
    begin 
        Len   :=   Length(Str)   div   2; 
        Point   :=   AllocMem(Len   +   1);//Len   +   1是为nil结尾的标志空出一个字节 
        Pointer(Result)   :=   Point; 
        for   i:=0   to   Len   do   Result[i]:=   Chr(StrToint( '$ '   +   Copy(Str,   i*2-1,   2))); 
        ReallocMem(Point,   Len   +   1); 
    end; 
      

  2.   

    copy函数
    Copy(s,开始位置,长度)
    关键是你要知道数据4开始位置结束位置(或者长度)
    转十进制:假如你截取到的数据是2A 3B,看你数据是否是低位在前,是就需要颠倒下(一般都需要,具体根据你自己的实际情况),
    像这样转StrToInt('$3B2A'),不是的话就StrToInt('$2A3B'),就是字符表示前面加上$符号就可以转整数了,
      

  3.   

    你好!我的数据4开始位置就是数据的30 30 44 39(U电压值:217V 转换十六进制:00D9H)请问COPY函数里所指的长度有包括0在内吗(0是否也指一个长度呢)??
      

  4.   

    可以为0,返回的是空字符,截取长度为0那你还截取什么呢?
    SS:='30 30 30 30 30 30 30 30 30 30 44 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 0D 0A'拿这个来举例子copy(ss,25,4)就得到30 30 44 39了
      

  5.   

    举个列子   if code='28' then//电池电量上报报文
        begin
          s1:=Copy(str,1,2);
          k:=StrToInt('$'+s1);//控制器编号
           s2:=Copy(str,3,2);//电压值 高字节
          s3:=Copy(str,5,2);//电压值 低字节
          i:=StrToInt('$'+s2)*256+strtoint('$'+s3);
          dy:=(9.93*i)/1024;
          s1:=FormatFloat('0.00',dy);
        end;