在记事本中,您可以打开任何文件,它将显示内部的原始数据.
我想在TMemo中这样做,但一直在努力寻找如何做到这一点.
我设法找到了这个code here.
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;
我需要更改什么才能以记事本的方式填写所有备忘录?
解决方法
好吧,这是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;
如果要用’.’替换不可打印的字符然后您可以通过修改上面的代码轻松地这样做:
if s[i]<#32 then s[i] := '.';