在记事本中,您可以打开任何文件,它将显示内部的原始数据.
我想在TMemo中这样做,但一直在努力寻找如何做到这一点.
我将它修改为一个函数并为我的目的稍微改了一下:
function OpenBinaryFile(var Data; Count: Cardinal): string;
var
Line: string[80];
i: Cardinal;
P: PAnsiChar;
nStr: string[4];
SL: TStringList;
const
posStart = 1;
binStart = 7;
ascStart = 57;
begin
P := @Data;
Line := '';
SL := TStringList.Create;
try
for i := 0 to Count - 1 do
begin
if (i mod 16) = 0 then
begin
if Length(Line) > 0 then
SL.Add(Trim(Line));
FillChar(Line, SizeOf(Line), ' ');
Line[0] := Chr(72);
end;
if P[i] >= ' ' then
Line[i mod 16 + ascStart] := P[i]
else
Line[i mod 16 + ascStart] := '.';
end;
SL.Add(Trim(Line));
Result := SL.Text;
finally
SL.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
它有效,但它每行只显示固定数量的字符,如下所示:

我需要更改什么才能以记事本的方式填写所有备忘录?
好吧,这if (i mod 16) = 0是将16行字符截断的测试.
我相信Notepad和这段代码一样:
var
i: Integer;
s: AnsiString;
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
SetLength(s, Stream.Size);
if Stream.Size>0 then
Stream.ReadBuffer(s[1], Stream.Size);
finally
Stream.Free;
end;
for i := 1 to Length(s) do
if s[i]=#0 then
s[i] := ' ';
Memo1.Text := s;
end;
Run Code Online (Sandbox Code Playgroud)
如果您想要替换不可打印的字符,'.'那么您可以通过修改上面的代码来轻松完成此操作:
if s[i]<#32 then
s[i] := '.';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2443 次 |
| 最近记录: |