2005年07月30日

指定された文字型データをダンプ形式に整形する方法

Client/Server型プログラムや
バックグラウンドプログラムが、
データ不備が原因でうまく
動かなかった経験はないでしょうか?
そんなあなたにプログラムが扱うデータを
ダンプ形式(16進数表示とASCII文字)で表示する
ちょっと便利な関数をDelphiで紹介します。

障害解析ツールなどに組み込んで利用してください。
本関数はマルチバイト文字未対応です。
必要に応じプログラムを修正し使用してくださいね。

ではさっそく、プログラムを紹介しましょうね。

_CoordinateDumpStringsソースは【続きを読む】をクリック!

関数仕様
function_CoordinateDumpStrings(
 pBuffer: PChar; pSize: integer;
  pStrList: TStrings): TStrings;
説明
_CoordinateDumpStrings関数は指定された文字列データをダンプ形式(16進数表示とASCII文字)に整形します。pBufferは文字列データの先頭ポインタを、pSizeは文字列データ長を指定します。関数がダンプ形式に整形した結果はpStrListに戻されます。
使用例
procedureTForm1.Button1Click(Sender: TObject);
begin
 // Memo1に入力された文字列をダンプ形式に整形し、
 // 整形した結果をMemo2に格納し表示する。

 Memo2.Lines.Clear;
 _CoordinateDumpStrings(
  Pointer(Memo1.Text),
   Length(Memo1.Text), Memo2.Lines);
end;

【画面イメージ】

CoordinateDumpStrings.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

注意:
 下記ソースファイルは、本ページの管理者である「guy」が個人的に作成しました。
 このソースは作者に断り無く、個人がコピー、改造することは許可しますが、
 いかなる場合であっても、商用目的に使用することを固く禁じます。
 あと、ホームページでの公開の都合上、各ソースの先頭に全角スペースが入ってます。
 あなたがDelphiでコンパイルする前に、この全角スペースを半角スペースに変換してくださいね。

Source: _CoordinateDumpStrings
function _CoordinateDumpStrings(
 pBuffer: PChar; pSize: integer; pStrList: TStrings): TStrings;
const
 MAX_RECORDBYTE = 16;
 SP_Pad = ' ';
 SP_Pad2 = ' ';
 SP_Pad3 = '  ';
 SP_Pad4 = '  ';
 SP_PAD6 = '   ';
 TitlePattern = '0123456789ABCDEF';
var
 lLine : integer;
 li, lj : integer;
 lRecord : string;
 lTmp : string;
 lTmpSize : integer;
 lLineSize : integer;
 lTmpStr : string;
begin
 lRecord := SP_Pad6 + SP_Pad;
 for li := 0 to MAX_RECORDBYTE - 1 do
 begin
  lTmp := SP_Pad;
  if li = 15 then
   lTmp := '';
  lRecord := lRecord + IntToHex(li,2) + lTmp;
 end;
 lRecord := lRecord + SP_Pad3 + TitlePattern;
 pStrList.Add(lRecord);
 //
 lLine := Trunc(pSize / MAX_RECORDBYTE);
 lTmpSize := pSize - (lLine * MAX_RECORDBYTE);
 if lTmpSize <> 0 then
  inc(lLine)
 else
  lTmpSize := MAX_RECORDBYTE;
 for li := 1 to lLine do
 begin
  lTmpStr := '';
  if li = lLine then
   lLineSize := lTmpSize
  else
   lLineSize := MAX_RECORDBYTE;
  lRecord := IntToHex((li - 1)*MAX_RECORDBYTE, 6) + SP_Pad;
  for lj := 1 to MAX_RECORDBYTE do
  begin
   lTmp := SP_Pad;
   if lj = MAX_RECORDBYTE then
    lTmp := '';
   if lLineSize > 0 then
   begin
    lRecord := lRecord +
     IntToHex(Integer(pBuffer[((li-1)*MAX_RECORDBYTE)+(lj-1)]), 2) + lTmp;
    if (pBuffer[((0+li-1)*MAX_RECORDBYTE)+(lj-1)] >= Char($20)) AND
      (pBuffer[((0+li-1)*MAX_RECORDBYTE)+(lj-1)] < Char($80)) Then
     lTmpStr := lTmpStr + pBuffer[((li-1)*MAX_RECORDBYTE)+(lj-1)]
    else
     lTmpStr := lTmpStr + '.';
   end
   else
   begin
    lRecord := lRecord + SP_Pad2 + lTmp;
    lTmpStr := lTmpStr + SP_Pad;
   end;
   DEC(lLineSize);
  end;
  lRecord := lRecord + SP_Pad3 + lTmpStr;
  pStrList.Add(lRecord);
 end;
 result := pStrList;
end;

posted by guy at 07:43 | 障害解析編
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。