1. 程式人生 > >檢視記憶體資料的函式

檢視記憶體資料的函式

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure
Button2Click(Sender: TObject);   end; var   Form1: TForm1; implementation {$R *.dfm} {用十六進位制檢視記憶體的函式; 引數1是記憶體起點, 引數2是以位元組為單位的長度} function ToHex(p: PByteArray; b: Integer): string; var   i: Integer; begin   for i := 0 to b - 1 do     Result := IntToHex(p^[i], 2) + Chr(32
) + Result;   Result := TrimRight(Result); end; {用二進位制檢視記憶體的函式; 引數1是記憶體起點, 引數2是以位元組為單位的長度} function ToBin(p: PByteArray; b: Integer): string; const   Convert: array['0'..'F'] of string = (     '0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001',     '', '', '', '', ''
, '', '', '1010', '1011', '1100', '1101', '1110', '1111'); var   i: Integer;   s: string; begin   s := ToHex(p, b);   for i := 1 to Length(s) do     if s[i] <> Chr(32) then       Result := Result + Convert[s[i]]     else       Result := Result + Chr(32); end; {測試一} procedure TForm1.Button1Click(Sender: TObject); var   num: Integer; begin   Randomize;   num := Random(MaxInt);   ShowMessage(IntToStr(num) + #10#13#10#13 +               ToHex(@num, 4) + #10#13#10#13 +               ToBin(@num, 4)); end; {測試二} procedure TForm1.Button2Click(Sender: TObject); var   str: string; begin   str := 'Delphi 2010';   ShowMessage(str + #10#13#10#13 +               ToHex(@str[1], Length(str)*SizeOf(str[1])) + #10#13#10#13 +               ToBin(@str[1], Length(str)*SizeOf(str[1]))); end; end.


重寫:


 

function ToBin2(p: PByteArray; b: Integer): string;
var
  i,j: Integer;
begin
  Result := StringOfChar('0', b * 8);
  for i := 0 to b - 1 do for j := 0 to 7 do
    if Odd(p^[b-1-i] shr j) then Result[i*8 + 8 - j] := '1';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  f: Single;
  str: string;
begin
  f := -31.4;
  str := ToBin2(@f, SizeOf(f));
  Memo1.Lines.Add(str);
end;