TMemo 의 Font 를 고정폭 글꼴로 해놓으면 제법 간지가 비슷하게 남.

하지만 스트링그리드 등을 이용하는게 옳겠지.

 

 

 

 

 

 

바이너리로 읽어서 Memo 에 뿌려주는 함수

 

procedure ShowBinary(var Data; Count: Cardinal);
const
  POS_START=1;
  BIN_START=7;
  ASC_START=57;
  HEX_CHARS: PChar='0123456789ABCDEF';

 

var
  Line: String[80];
  i: Cardinal;
  p: PChar;
  nStr: String[4];

 

begin
  Form1.Memo1.Lines.Clear;
  Form1.ProgressBar1.Position:=0;

 

  p:=@Data; // 메모리를 포인터에 연결
  Line:='';

 

  // 매개변수로 넘어온 길이만큼 읽어들이기 시작
  for i:=0 to Count-1 do begin
    Form1.ProgressBar1.Position:=Round((i / Count)*100);

 

    // 16진수니까 16으로 나눈 나머지가 0 이면 새로운 라인 시작
    if (i mod 16)=0 then begin
      if
Length(Line)>0 then begin
        Form1.Memo1.Lines.Add(Line);
        Application.ProcessMessages;
      end;

 

      // Line 초기화
      FillChar(Line, SizeOf(Line), ' ');

 

      Line[0]:=Chr(72);

 

      nStr:=Format('%4.4X', [i]); // 오프셋
      Move(nStr[1], Line[POS_START], Length(nStr));
      Line[POS_START+4]:=':';
    end;

 

    if p[i]>=' ' then Line[i mod 16 + ASC_START]:=p[i] // 아스키
    else                Line[i mod 16 + ASC_START]:='.';

 

    Line[BIN_START+3*(i mod 16)]:=HEX_CHARS[(Ord(p[i]) shr 4) and $F]; // 16진수
    Line[BIN_START+3*(i mod 16)+1]:=HEX_CHARS[Ord(p[i]) and $F];

  end; // for

 

  Form1.Memo1.Lines.Add(Line);
end;

 

 

 

 

 

이런식으로 사용하면 됨.

 

procedure TForm1.Button1Click(Sender: TObject);
var
  mStream: TMemoryStream;
  dlgOpen: TOpenDialog;

 

begin
  dlgOpen:=TOpenDialog.Create(Self);
  mStream:=TMemoryStream.Create;
  try
    if dlgOpen.Execute then begin
      mStream.LoadFromFile(dlgOpen.FileName);
      ShowBinary(mStream.Memory^, mStream.Size);
    end;
  finally
    FreeAndNil(mStream);
    FreeAndNil(dlgOpen);
  end;
end;







Posted by bloodguy
,