サンプルプログラムは10行表示まで、という制限が付いています 条件付きコンパイルをしてるので、フラグを落とせば制限は消えます バイナリエディタのような表示形式でファイル内容を表示するサンプルで、pDebug.dll を使用してメモ帳に直接出力しています。以下は主要処理部分になります。空ファイルが渡されたり、ファイルパスに空文字が含まれていたりするとエラーになったりするので細かい改造が必要です。 Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Const BYTE_DATA_NUM As Long = 16 'ヘッダ Private Const DUMP_HEADER As String = _ " ADDRESS +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF" '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ' 関数名:ExecuteDump ' 機 能:ダンプを実行する ' 引 数:(i)DataBuffer … データバッファ ' 返り値:とりあえず無し '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Public Sub ExecuteDump(ByRef DataBuffer() As Byte) Dim DataSize As Long Dim Lines As Long Dim i As Long Dim WorkBuffer() As Byte Dim StartPos&, CopySize As Long 'データサイズ(要するにファイルサイズ)を取得する DataSize = UBound(DataBuffer) + 1 '行数取得 Lines = (DataSize \ BYTE_DATA_NUM) + IIf(DataSize Mod BYTE_DATA_NUM > 0, 1, 0) '1行単位にデータを取得する For i = 0 To Lines - 1 'ヘッダ出力 If i = 0 Then Call pDebug(DUMP_HEADER) End If 'コピー位置とコピーサイズを取得 StartPos = i * BYTE_DATA_NUM CopySize = DataSize - StartPos If CopySize > BYTE_DATA_NUM Then CopySize = BYTE_DATA_NUM '作業用データバッファ再確保 ReDim WorkBuffer(CopySize - 1) As Byte 'データ取得 Call CopyMemory(WorkBuffer(0), DataBuffer(StartPos), CopySize) '行データを取得する Call pDebug(GetLineData(i, WorkBuffer)) Next i End Sub '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ' 関数名:GetLineData ' 機 能:1行読む ' 引 数:(i)Lines … 行 ' (i)Data … データ ' 返り値:とりあえず無し '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Private Function GetLineData(ByVal Lines As Long, ByRef Data() As Byte) As String Dim LineData(2) As String Dim i As Long 'まずは左側 LineData(0) = Right$("00000000" & Hex$(Lines), 8) & Space$(1) '次は中央 For i = 0 To UBound(Data) '横着せず、IIf文ではなくきちんとIf文で書いてみる If Data(i) < BYTE_DATA_NUM Then LineData(1) = LineData(1) & "0" & Hex$(Data(i)) & Space$(1) Else LineData(1) = LineData(1) & Hex$(Data(i)) & Space$(1) End If Next i 'データ数が16に満たない場合は空文字を設定 If UBound(Data) <> (BYTE_DATA_NUM - 1) Then LineData(1) = LineData(1) & Space$(3 * (BYTE_DATA_NUM - (UBound(Data) + 1))) End If '最後に右側 'こっから先はData()の値を使用しないので、直接書き換えちゃえ!! For i = 0 To UBound(Data) Select Case Data(i) '都合の悪いデータはピリオドにする '&HDと&HAは改行コード &H9はタブ Case &H0, &HFF, &HD, &HA, &H9 Data(i) = &H2E End Select Next i LineData(2) = StrConv(Data, vbUnicode) '文字列連結 For i = 0 To UBound(LineData) GetLineData = GetLineData & LineData(i) Next i End Function |