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类型的值 |
|