程序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的时候显的太慢了,有没有更快一点的方法?
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的时候显的太慢了,有没有更快一点的方法?
解决方案 »
- 如何创建TParameters参数
- delphi 高手帮忙!求求你了,我哭啊,我想跳楼啊5555555555555~~~~~~~~~~`
- 串口数据能能够远程方法调用吗?
- IBM 面试试题,有谁知道答案?
- 如何将dxDBGRID导出成EXCEL
- 关于caption
- 我如何能在运行程序的时候让我的电脑屏幕呈现windows关机时候的“虚屏”现象?
- 请问哪里有delphi6.0可以下载和delphi7.0的序列号!在线等待!
- Delphi报表专家.
- delphi 2010 dll 加载问题
- 如何用delphi操作记录型文本文件。
- 在线等待200分-用corba开发的系统临近运行,发现多网段corba客户端无法访问corba服务器。
而是IntToHex处理速度
考虑用HexEditor这类第三方控件,效果和UE类似的
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十六进制编辑器控件