程序1: 
var 
B: Byte; 
S: string; 
Stream : TStream; 
Pos, Sze: DWORD; 
begin 
Stream := TMemoryStream.Create; 
try 
with TFileStream.Create('C:\haha.txt', fmOpenRead) do 
try 
Pos := 0; 
Sze := Size; 
while Pos <> Sze do 
begin 
Seek(Pos, 0); 
Inc(Pos, Read(B, sizeof(Byte))); S := IntToHex(B, 2); 
Stream.Write(S[1], Length(S)); 
end; Stream.Seek(0, 0); 
Memo1.Lines.LoadFromStream(Stream); 
finally 
Free; 
end; 
finally 
Stream.Free; 
end; 
end; 
程序2: 
var 
iFileHandle: Integer; 
iFileLength: Integer; 
iBytesRead: Integer; 
Buffer: array of Byte; 
i: Integer; 
str:String; 
begin 
iFileHandle := FileOpen('C:\haha.txt', fmOpenRead); 
iFileLength := FileSeek(iFileHandle, 0, 2); 
FileSeek(iFileHandle, 0, 0); 
SetLength(Buffer, iFileLength); 
iBytesRead := FileRead(iFileHandle, Buffer[0], iFileLength); 
FileClose(iFileHandle); 
str := ''; 
for i := 0 to iBytesRead - 1 do 
begin 
str := str + IntToHex(Buffer[i],2)+' '; 
end; 
ShowMessage(str); 
Buffer := nil; 
end; 我的目的是读取一个文件然后对文件中的某些特定字符后面的值进行分析。 以上两个程序都可以实现将二进制文件读出并显示出来,但是当读取文件比较大500K的时候显的太慢了,有没有更快一点的方法? 

解决方案 »

  1.   

    并不是读文件慢
    而是IntToHex处理速度
      

  2.   

    UI慢而已~大数据不能这样显示的
    考虑用HexEditor这类第三方控件,效果和UE类似的
      

  3.   

    参考如下代码:
    const
      HEXCHARS: array[0..16 - 1] of Char = '0123456789ABCDEF';
    var
      I, J: Integer;
      vLine: Integer; // 行数
      vPos: Integer;
      S: string;
      vBuffer: array[0..$1000 - 1] of Byte;
    begin
      Memo1.Clear;
      Memo1.WordWrap := False; // 不要自动换行  with TFileStream.Create('C:\haha.txt', fmOpenRead) do try
        vLine := 0;
        vPos := 0;
        J := Read(vBuffer, SizeOf(vBuffer)); // 一次读0x1000字节到缓存
        SetLength(S, Size * 3 + Size div 16 * 2); // 每个字节显示3个字符("HH "),每16个字节为一行。
        while J > 0 do
        begin
          for I := 0 to J - 1 do
          begin
            S[vPos * 3 + vLine * 2 + 1] := HEXCHARS[vBuffer[I] shr 4];
            S[vPos * 3 + vLine * 2 + 2] := HEXCHARS[vBuffer[I] and $0F];
            S[vPos * 3 + vLine * 2 + 3] := #32;
            if (vPos + 1) mod 16 = 0 then
            begin
              S[vPos * 3 + vLine * 2 + 4] := #13;
              S[vPos * 3 + vLine * 2 + 5] := #10;
              Inc(vLine);
            end;
            Inc(vPos);
          end;
          J := Read(vBuffer, SizeOf(vBuffer));
        end;
      finally
        Free;
      end;
      Memo1.SetTextBuf(PChar(S));
    end;以前写了一个控件,楼主也可以参考一下
    Delphi十六进制编辑器控件