在论坛中也没找到合适的答案,只好重问一下了。我要做的事:
1、打开一个16进制的文件,里面内容如:……E1 81 D9 DF……
2、从里面匹配到字符串,如:31 99 F3
3、定位该字符串的位置,找到其前后两个“E1”的位置
4、将这两个E1中的字符串拷贝出来,保存入新的txt文件中。好复杂啊,有没有高人指点一下,给出代码最好!

解决方案 »

  1.   

    http://download.csdn.net/source/160432
      

  2.   

    一个例程, 将F:\1.HEX中符合条件的字符串写入F:\1.TXT中:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      iFile : Integer;
      iSize : Integer;
      sData : String;
      sOut  : String;
      iPos  : Integer;
      iStart: Integer;
      iEnd  : Integer;
    begin
      iFile := FileOpen('F:\1.HEX', fmOpenRead);
      if iFile <> -1 then
      begin
        iSize := FileSeek(iFile, 0, 2);
        FileSeek(iFile, 0, 0);
        SetLength(sData, iSize);
        FileRead(iFile, SData[1], iSize);
        FileClose(iFile);
        sData := AnsiReplaceStr(sData, #13#10, ' ');
        sOut := '';
        iPos := 1;
        repeat
          iPos := PosEx('31 99 F3', sData, iPos);
          if iPos <= 0 then break;
          iStart := iPos - 1;
          while iStart > 0 do
          begin
            if Copy(sData, iStart, 2) = '51' then break;
            dec(iStart);
          end;
          iEnd := PosEx('51', sData, iPos);
          if (iStart > 0) and (iEnd > 0) then sOut := sOut + Copy(sData, iStart, iEnd - iStart + 2) + #13#10;
          inc(iPos);
        until False;
        iFile := FileCreate('F:\1.TXT');
        if iFile <> -1 then
        begin
          FileWrite(iFile, sOut[1], Length(sOut));
          FileClose(iFile);
        end;
      end;
    end;
      

  3.   

    to:jadeluo(秀峰) 
    谢谢给的例程,基本理解了,可是PosEx('31 99 F3', sData, iPos);没能够把这个串定位到,是不是16进制的有什么讲究?定位的时候需要转换一下?
      

  4.   

    以上代码适用于1.HEX的内容是由一组十六进制组成的字符串的情况下。
    看了楼主最后一个回复,感觉楼主手头的文件又好象是二进制文件了,楼主最好确认一下。
      

  5.   

    应该是16进制文件啊,在ultraEdit里必需点“H”那个按钮才能看,不然是乱码。而且和下载的那个控件里的样例看见是一样的格式啊。
    UltraEdit里看到的格式:
    00000000h: E1 81 D9 DF……;后面几个乱码
    00000010h: 03 02 01 01……;
    ……
      

  6.   

    应该是16进制文件啊,在ultraEdit里必需点“H”那个按钮才能看,不然是乱码。而且和下载的那个控件里的样例看见是一样的格式啊。
    UltraEdit里看到的格式:
    00000000h: E1 81 D9 DF……;后面几个乱码
    00000010h: 03 02 01 01……;
    ……明显是个二进制文件。以上代码对它没用处,需要另外写一个了。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      iFile : Integer;
      iSize : Integer;
      bData : array of Byte;
      sOut  : String;
      iPos  : Integer;
      iStart: Integer;
      iEnd  : Integer;
      iLoop : Integer;
    begin
      iFile := FileOpen('F:\1.HEX', fmOpenRead);
      if iFile <> -1 then
      begin
        iSize := FileSeek(iFile, 0, 2);
        FileSeek(iFile, 0, 0);
        SetLength(bData, iSize);
        FileRead(iFile, bData[0], iSize);
        FileClose(iFile);
        sOut := '';
        iPos := 0;
        repeat
          while iPos <= iSize - 3 do
          begin
            if (bData[iPos] = $31) or (bData[iPos + 1] = $99) or (bData[iPos + 2] = $F3) then break;
            inc(iPos);
          end;
          if iPos > iSize - 3 then break;
          iStart := iPos - 1;
          while iStart >= 0 do
          begin
            if bData[iStart] = $51 then break;
            dec(iStart);
          end;
          iEnd := iPos + 3;
          while iEnd < iSize do
          begin
            if bData[iEnd] = $51 then break;
            inc(iEnd);
          end;
          if (iStart >= 0) and (iEnd < iSize) then
          begin
            for iLoop := iStart to iEnd do
              sOut := sOut + IntToHex(bData[iLoop], 2) + ' ';
            sOut := sOut + #13#10;
          end;
          inc(iPos);
        until iPos > iSize - 3;
        iFile := FileCreate('F:\1.TXT');
        if iFile <> -1 then
        begin
          FileWrite(iFile, sOut[1], Length(sOut));
          FileClose(iFile);
        end;
      end;
    end;
      

  8.   

    H的是二进制?我孤陋寡闻了!$不是表示16进制吗?还有,上述代码能定位串了,可是写到新文件里,那几个数字倒是一样,格式却好像不一样了,没有00000000h:和后面的乱码了,所以原来用的分析软件识别不了这个格式了。还有还有,我要查找的串是动态的,比如从edit里面输入,如str='F3',那怎么能以变量的形式赋给bData[iPos]?(赋值成:bData[iPos]=$F3)想不出来……不知道我的问题说清楚没?能不能加我的qq:4716 4631我把需要处理的文件给您瞅瞅?
      

  9.   

    to:jadeluo(秀峰)应该是写的问题,发现打开1.txt,里面直接可以看到这些16进制符号,而不是原来的乱码了。用“H”按钮显示后,变成原来的00000000h:……格式了,但又不是原来的符号了。我是想把里面的内容原封不动地截过来,希望用“H”按钮显示后是一样的,是不是sOut := sOut + IntToHex(bData[iLoop], 2) + ' ';的时候不进行转换?可是这就涉及到上面那个问题了,字符串类型和字节型之间的转换?
      

  10.   

    写的问题解决了,我把写的代码改为:FileWrite(iFile, bData[iStart], iEnd-iStart+1);
    就可以原封不动地拷贝过去了。但是还有一个问题,就是上面问过的:怎么能把字符串str='F3'以变量的形式赋给bData[iPos]?(赋值成:bData[iPos]=$F3)