● ファイル内容を16進数でダンプする ●

ダウンロード (38KB)
サンプルプログラムは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

戻る