我的程序先通过GetFromRes获得资源流s,然后将s读入缓冲区:
(var DiskBuffer:Pointer;DiskSize:Integer;) 
DiskSize:=s.size;
GetMem(DiskBuffer,DiskSize);
s.Readbuffer(DiskBuffer^,DiskSize);
s里有一个129,080字节的LOGO.SYS,该LOGO.SYS最开始六字节分别为42H、4DH、38H、F8H、01H、00H,我现在想用另一个129,080字节的文件覆盖掉缓冲区中的LOGO.SYS,该怎么做啊?
关键就是这串“42H、4DH、38H、F8H、01H、00H”特征码的查找,不能按字符串方式的啊~~ 谢谢指点,不胜感激啊 ^_^

解决方案 »

  1.   

    up
    小弟初学者,只能Learning了
      

  2.   

    上面的GetFromRes是我自己的一个函数:
    //从资源文件中调出资源流
    Function GetFromRes(Instance:LongWord;ResName:Pchar):TResourceStream;
    var
      hFind: THandle;
      ResFile:TResourceStream;
    begin
     ResFile:=nil;
     Try
      hFind:=FindResource(Instance,ResName, RT_RCDATA);
      if hFind<>0 then ResFile:=TResourceStream.Create(Instance,ResName,RT_RCDATA);
     Except
      ResFile:=Nil;
     End;
     Result:=ResFile;
    end;
      

  3.   

    编译原理里状态转换的方法或许可用。比如从状态A读到42H则转换到下一状态B,再读到4DH则再走到下一状态C,若此时得到的不是38H则转到A,若是38H则走到D……每个状态对应一个过程(或函数),在过程中进行判断跳转。
      

  4.   

    先在纸上画个状态转换图,写起来就比较轻松了。+-->A(Start)->[42H]->B->[4DH]->C->[38H]->D……Z->[00H]->DONE
    |   |                |         |              |   
    |   |[NOT 42H]       |         |              | [NOT 00H]
    +---+                |         |              |
    |           [NOT 4DH]|         |              ...
    +<-------------------+         |
    |                     [NOT 38H]|
    +<-----------------------------+然后也就是在表示当前状态过程里调用一下表示其它状态的过程而已。
      

  5.   

    precdure A(data: Integer);
    begin
      if data=42H then B(读出下一字符作为参数)
      else if (整个串都结束,还是没找到) then Exit;
      else A;
    end;precedure B(data: Integer);
    begin
      if data=4DH then C(读出下一字符作为C的参数)
      else A;
    end;……类似如此。
      

  6.   

    嘿嘿,现在是这样做的,可以正确取得位置了 ^_^unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;
    type
      Buffer_Type = array [1..6] of BYTE;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        BitBtn1: TBitBtn;
        Label3: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Edit1DblClick(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
        DiskBuffer:Pointer;
        DiskSize:Integer;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}//从资源文件中调出资源流
    Function GetFromRes(Instance:LongWord;ResName:Pchar):TResourceStream;
    var
      hFind: THandle;
      ResFile:TResourceStream;
    begin
     ResFile:=nil;
     Try
      hFind:=FindResource(Instance,ResName, RT_RCDATA);
      if hFind<>0 then ResFile:=TResourceStream.Create(Instance,ResName,RT_RCDATA);
     Except
      ResFile:=Nil;
     End;
     Result:=ResFile;
    end;function SearchPos(SourceStream:TStream;fBuf:Buffer_Type;Find_Size:LongInt):LongInt;
    var
      Read_Count,count,n:LongInt;
      temp_byte : BYTE;
      Buffer:Buffer_Type;
    begin
      Read_Count := 0;
      while (Read_Count<SourceStream.Size) do
      begin
         SourceStream.ReadBuffer(temp_byte,1);
         Read_Count := Read_Count + 1;
         if (temp_byte = fBuf[1]) then
         begin
            SourceStream.Seek(Read_Count,soFromBeginning);
            SourceStream.ReadBuffer(Buffer,Find_Size);
            count:=1;
            for n:=1 to Find_Size do
            begin
               if Buffer[n-1]<>fBuf[n] then
               begin
                  count:=0;
                  break;
               end;
            end;
            if count=1 then
            begin
               Read_Count := Read_Count-1;
               break;
            end;
            SourceStream.Seek(Read_Count,soFromBeginning);
         end;
      end;
      Result:=Read_Count;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var s:TStream;
    begin
      s:=TMemoryStream.Create;
      Try
        s:=GetFromRes(hInstance,'bootpres');
        DiskSize:=s.size;
        GetMem(DiskBuffer,DiskSize);
        s.Readbuffer(DiskBuffer^,DiskSize);
        Label1.Caption:='Buffer Load Ok!';
        Label2.Caption:=IntToStr(DiskSize);
      Except
        if DiskBuffer<>NIL then FreeMem(DiskBuffer,DiskSize);
        DiskBuffer:=Nil;
        DiskSize:=-1;
        Label1.Caption:='Buffer function stop';
      End;
      s.Free;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if DiskBuffer<>nil then
        FreeMem(DiskBuffer,DiskSize);
    end;procedure TForm1.Edit1DblClick(Sender: TObject);
    begin
      Edit1.Text:='';
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    var s:TStream;
        SearchArr:Buffer_Type;
        PosArr:LongInt;
    begin
      s:=TMemoryStream.Create;
      Try s:=GetFromRes(hInstance,'bootpres');
      Except Edit1.Text:='Error!';
      End;
      SearchArr[1]:=Byte($42);
      SearchArr[2]:=Byte($4D);
      SearchArr[3]:=Byte($38);
      SearchArr[4]:=Byte($F8);
      SearchArr[5]:=Byte($01);
      SearchArr[6]:=Byte($00);
      PosArr:=SearchPos(s,SearchArr,6);
      s.Free;
      Label3.Caption:=IntToStr(PosArr);
    end;end.