0F 88 88 88 00 00 00 00 00 01 10 FF FF FF FF FF 6F 12 34 56 85 24 B5 C8 FF FF FF FF FF FF FF FF FF FF D9 F8 7A BE AA 14 03 38 02 00 FC 00 1B 00 00 00 04 00 0E 00 35 00 1B 00 7B 01 58 0C 77 BF 
00 00 00 00 00 00 00 00 00 00 00 00 85 1D 1D 06 00 00 00 00 00 3C 0F 55 00 67 00 00 00 00 00 00 58 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 08 
41 A5 14 03 4D 00 2A 00 01 A5 14 03 4D 14 50 0D 12 A5 14 03 4D 00 2A 00 02 A5 14 03 4D 14 50 0D 04 A5 14 03 4D 14 50 0D 00 A5 14 03 4D 14 50 0D 00 A5 14 03 71 14 50 0D B0 A5 14 03 74 14 50 0D 按照规律,$10*2+1  这样读到的位置就是 第一行 6F那个位置 
     0F  88 88 88 00 00 00 00 00 01 10 FF FF FF FF FF 6F
位置 00H 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10没错,吻合-----------------------------------------------------------
但是到了第二段
      00 00 00 00 00 00 00 00 00 00 00 00 85 1D 1D 06 00 00 00 00 00 3C 0F 55 00 67 00
位置 40H 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4f 50 51 52 53 54 55 56 57 58 59 5A比如我读 59H 5A 两个地址的 ptl:=copy(str,$59*2+3,4);  就得$59*2+3了,+1就对不上号了.
-----------------------------------------------------------到了第三段      41 A5 14 03 4D 00 2A 00 01 A5 14 03 4D 14 50 0D 12 A5 
位置 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91读80H-87Hedit1.Text:=copy(str,$80*2+1,16) ----> 结果: 08 41 A5 14 03 4D 00   不仅说读的开始位置不对,还少读出一位edit1.Text:=copy(str,$80*2+3,16) ----> 结果: 41 A5 14 03 4D 00 2A   少读了.开始位置正确edit1.Text:=copy(str,$80*2+5,16) ----> 结果: 41 A5 14 03 4D 00 2A   和上面一样edit1.Text:=copy(str,$80*2+5,18) ----> 结果: 41 A5 14 03 4D 00 2A 00  这才正确
  ----------------copy(str,$10*2+1,16)
copy(str,$59*2+3,16)
copy(str,$80*2+5,18)三段编码,发生了这样的变化.
不知道是什么原因造成的呢?---------------------
读两段编码的交界的几位也会出现奇怪的问题
比如
读3F edit5.Text:=copy(str,$3F*2+1,2); 读出来为BF 正确
     edit5.Text:=copy(str,$3F*2+3,2);  读出来为空值
应该是这里两个空格占了两个位置.
但是trim()之类的我也用过了,没有效果.好像每段后面的空格都是固定存在的.
不晓得有什么办法好解决.
//编码在data.txt文本里,
procedure TForm1.FormShow(Sender: TObject);
var strs:TStringList;
   str,strPass,strProducerID,strProductID,ptl,strtmp,shiNengTest:string;
begin
//with PageControl1 dostrs:=TStringList.Create;
strs.LoadFromFile('data.txt');
str:=StringReplace(strs.text,#13,'',[rfReplaceAll]);//这个用不用好像都没反应,没体现他的作用
str:=StringReplace(strs.text,' ','',[rfReplaceAll]);
...
end;

解决方案 »

  1.   

    自己再小研究一下吧.呵.~总的意思就是说按理说,通篇的编码用copy(str,$10*2+1,16) 
     这样的读法,就应该可以了,可是到后面的编码用这样读法位置都不对.
      

  2.   

    凭什么要copy(str,$10*2+1,16) 这样去读呢?
    位置哪里不对呢?还是不知道你在问什么。
      

  3.   


    copy(str,$10*2+1,16) 这样就是去读位置10H的数据么.我要读10H开始的往后的16个数字.呵,这招还是当初您教我的
      

  4.   

    ---第一段
    0F 88 88 88 00 00 00 00 00 01 10 FF FF FF FF FF 6F 12 34 56 85 24 B5 C8 FF FF FF FF FF FF FF FF FF FF D9 F8 7A BE AA 14 03 38 02 00 FC 00 1B 00 00 00 04 00 0E 00 35 00 1B 00 7B 01 58 0C 77 BF 
    ---第二段
    00 00 00 00 00 00 00 00 00 00 00 00 85 1D 1D 06 00 00 00 00 00 3C 0F 55 00 67 00 00 00 00 00 00 58 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 08 
    ---第三段
    41 A5 14 03 4D 00 2A 00 01 A5 14 03 4D 14 50 0D 12 A5 14 03 4D 00 2A 00 02 A5 14 03 4D 14 50 0D 04 A5 14 03 4D 14 50 0D 00 A5 14 03 4D 14 50 0D 00 A5 14 03 71 14 50 0D B0 A5 14 03 74 14 50 0Dcopy(str,$10*2+1,2)
    就是读 下面表中10H那个位置后的数字,也就是6F
    数据  0F 88 88 88 00 00 00 00 00 01 10 FF FF FF FF FF 6F 
    位置 00H 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 第一段编码用$10*2+1 都会对嘛
    第二段第三段就不对的.
    比如我想读第三段开始的41这个数据
    41的位置是80H
    按理说是$80*2+1 就是80H位置上的数据了嘛
    可事实上读出来的不是
     
      

  5.   

    edit1.Text:=copy(str,$80*2+1,16) ----> 结果: 08 41 A5 14 03 4D 00  不仅说读的开始位置不对,还少读出一位 edit1.Text:=copy(str,$80*2+3,16) ----> 结果: 41 A5 14 03 4D 00 2A  少读了.开始位置正确 edit1.Text:=copy(str,$80*2+5,16) ----> 结果: 41 A5 14 03 4D 00 2A  和上面一样 edit1.Text:=copy(str,$80*2+5,18) ----> 结果: 41 A5 14 03 4D 00 2A 00  这才正确 
                            ----------
                         这里,按前面的规律是只要写成$80*2+1,16就对了吧.
      

  6.   

    str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]);//这个用不用好像都没反应,没体现他的作用 
      

  7.   

    str:=StringReplace(strs.text,#13,'',[rfReplaceAll]);
    这个我原本的意思是说 有碰到换行的,把他给删了.
    结果好像没效果,所以这一行我没有用到.
     
    str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]);
    #$D#$A这个是什么意思呢/ 我尝试也用了一下,位置还是对不上号呢
      

  8.   

    一 copy(str,$80*2+1,2); 读到了第二段编码的最后一位:08 (按规律,$80*2+1,2 这样写法就应该读到下面三的结果)
    二 copy(str,$80*2+3,2); 读到的为空
    三 copy(str,$80*2+5,2); 读到了第三段编码的第一位:41  (这个才是想要的结果.)
      

  9.   


    str:=StringReplace(strs.text,#$D,'',[rfReplaceAll]); 
    str:=StringReplace(strs.text,#$A,'',[rfReplaceAll]); 这样总可以了,不知道你的换行是什么符。
      

  10.   

    我想可以把问题简化了,呵.
    应该是那换行引起的.不过还不晓得怎么处理啊.
    str:=StringReplace(strs.text,#$D,'',[rfReplaceAll]); 
    str:=StringReplace(strs.text,#$A,'',[rfReplaceAll]); 
    这个我试了,不成哪.呵原始编码是如下
    0F 88 88 88 00 00 
    00 00 00 01 10 FF去除空格后 str:=StringReplace(strs.text,' ','',[rfReplaceAll]) 
    0F8888880000 
    0000000110FF
    最终应该不让其换行,应为
    0F88888800000000000110FF
    这样处理后的字符串拿来用,位置应该就对得上号了.
    但是要怎样将两行字符串连一起呢?
      

  11.   

    str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]);
    str:=StringReplace(strs.text,' ','',[rfReplaceAll]) 改成str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]);
    str:=StringReplace(str.text,' ','',[rfReplaceAll]) 
      

  12.   

    str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]); 
    str:=StringReplace(strs.text,' ','',[rfReplaceAll]) 改成 str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]); 
    str:=StringReplace(str ,' ','',[rfReplaceAll]) 
    或str:=StringReplace(strs.text,#$D,'',[rfReplaceAll]); 
    str:=StringReplace(str,#$A,'',[rfReplaceAll]); 
    str:=StringReplace(str ,' ','',[rfReplaceAll]) 
      

  13.   


    str:=StringReplace(strs.text,#$D#$A,'',[rfReplaceAll]); 
    str:=StringReplace(str.text,' ','',[rfReplaceAll]) 是这里的问题了..晕死了.呵.太不认真了.
    str:=StringReplace(strs.text,' ','',[rfReplaceAll]) 
    str:=StringReplace(str,#$D#$A,'',[rfReplaceAll]); 这样就OK了