分享

核心教程第二十五课-十六进制可执行文件阅读器

 工厂应用 2018-04-06
 
  
 procedure TForm1.btn1Click(Sender: TObject);
var
  PeName:string;
  Stream :TMemoryStream;
  buf:array [1..16] of Char;
  s,temp:string;
  PeSize:Integer;
  Count:Integer;//每次读取内存流中十六个字节的数据,用于循环操作的次数
  i,n,k:Integer;
begin
  try
    Stream:=TMemoryStream.Create;
    Stream.LoadFromFile('C:\Users\Administrator\Desktop\2018-04-06_164946.bmp');
    pesize:=Stream.Size;
    Stream.Position:=0; //把内存流的位置定位当流的最前面
    Count:=PeSize div 16;//取得循环的次数
    s:='';
    //循环读取内存流中的数据
    for k:=0 to Count+1 do
    begin
      //取得内存流的当前位置,x表示一个整数,以十六进制的形式返回
      temp:=Format(';%.5x',[Stream.Position]);
      //把字符串temp添加到s的尾部
      AppendStr(s,temp+'  ');
      //从内存流中读取16字节的数据,保存到缓冲区buf中,n是实际读取的字节数据
      n:=Stream.Read(buf,16);
      //n=0表示没有读取出数据
      if n=0 then Break;
      for i:=1 to n do
      begin
        //在缓冲区中取出一个字符,转化成整数,再转换成16进制形式
        //ord是取得buf[i]的ASCII码
        AppendStr(s,IntToHex(ord(buf[i]),2)+' ');
        // 让取出的数据四个一组,这样比较整齐美观
        if i mod 4=0 then
        begin
          AppendStr(s,' ');
        end;
      end;
     //返回一个指定数量字符的字符串
      AppendStr(s,stringofchar(' ',62-Length(S)));
      //程序中实际的标识
      for i:=1 to n do
      begin
        //32和126之间的,都是可以从键盘上直接输入的字符,字母,标点符号
        //32之前的系统符号,126之后的是保留符号和特殊符号,都无法显示
        if (buf[i]<#32) or (buf[i]>#126) then buf[i]:='.';
        AppendStr(s,buf[i]);
      end;
      RichEdit1.Lines.Add(s);
      s:='';
      temp:='';
    end;

  finally
      Stream.Free;
  end;
end;

=====================================================================
buf内读取到的内容为
(#126,#11,#15,#127,#126,#199,#183,#127,'m','o','d','x','m','o',#13,#10)
ord(buf[i])是获得buf[i]的ASCII编码值​,返回的是一个byte类型的值

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多