메모리로 파일을 읽어들여서 Hex 구조로 적절히 변환하여 보여주는 것이다.
물론 아스키값도 함께 출력한다. (아스키라면..)
 
일단, 메모리를 받아 바이너리로 출력하는 함수
 
// 그냥 TMemo 에 출력하는 함수 
procedure Memo(s: String);
begin

Form1.Memo1.Lines.Add(s); 

end;  
 
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

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

Line:=''

  

// 매개변수로 넘어온 길이만큼 읽어들이기 시작 

for i:=0 to Count-1 do begin 

  

// 16진수니까 16으로 나눈 나머지가 0 이면 새로운 라인 시작 

if (i mod 16)=0 then begin 

if Length(Line)>0 then Memo(Line); 

  

// 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 

 

Memo(Line);  

end;   
 
 
실제로 최종적으로 사용할 때는 이렇게 쓰면 됨.
 
procedure Form1.Button1Click(Sender: TObject);
var mStream: TMemoryStream;
begin

mStream:=TMemoryStream.Create; 

try 

mStream.LoadFromFile('C:\index.dat'); 

ShowBinary(mStream.Memory^, mStream.Size); 

finally 

if Assigned(mStream) then FreeAndNil(mStream); 

end

end;  





Posted by bloodguy
,