バイナリエディタのような表示

下記のようなバイナリエディタの表示をスクリプトで作成します。

43 6C 72 4D 6F 6E 28 29  0D 0A 53 68 6F 77 4D 6F  ClrMon()..ShowMo
6E 28 20 74 72 75 65 20  29 0D 0A 0D 0A 70 61 74  n( true )....pat
68 20 3D 20 22 63 3A 5C  5C 74 65 6D 70 5C 5C 62  h = "c:\\temp\\b
69 6E 64 69 73 70 2E 6C  75 61 22 0D 0A 66 69 6C  indisp.lua"..fil
65 20 3D 20 69 6F 2E 6F  70 65 6E 28 20 70 61 74  e = io.open( pat
68 2C 20 22 72 62 22 20  29 0D 0A 0D 0A 69 66 20  h, "rb" )....if 
66 69 6C 65 20 7E 3D 20  6E 69 6C 20 74 68 65 6E  file ~= nil then
0D 0A 0D 0A 09 2D 2D 20  83 74 83 40 83 43 83 8B  .....-- ファイル
83 54 83 43 83 59 8E E6  93 BE 0D 0A 09 63 75 72  サイズ取得...cur
   :
   :

ScriptEditor に下記のスクリプトを貼り付けて、path を適当なファイル名に置き換えて実行して下さい。実行結果をデバッグモニタに表示します。

ClrMon()
ShowMon( true )

-- Stabilizerにフォーカスが移動するまで若干のウェイト
Wait( 10 )

path = "c:\\temp\\bindisp.lua"
file = io.open( path, "rb" )

if file ~= nil then

    -- ファイルサイズ取得
    cur = file:seek()
    size = file:seek( "end" )
    file:seek( "set", cur )

    -- 全読込み
    data = file:read( "*all" )
    file:close()

    str = ""
    text = ""
    for i=1, size do
        -- 16進表示
        str = str .. string.format( "%02X ", string.byte( data, i ) )
        b = string.byte( data, i )
        temp = string.format( "%c", b )

        -- テキスト表示
        -- 制御コードは"."に置き換え
        if b >= 0 and b < 0x20 or b == 0x7f then
            temp = "."
        end
        text = text .. temp

        r = i % 16
        if r == 0 then
            str = str .. " " .. text
            DOut( str )
            DOut( "\n" )
            str = ""
            text = ""

        -- 8バイト目と9バイト目にはスペースを1つ追加
        elseif r == 8 then
            str = str .. " "
        end
    end

    -- 最終行を表示
    r = size % 16
    if r > 0 then r = 16 - r end

    if r ~= 0 then
        n = r * 3 + 1
        if r > 8 then n = n + 1 end
        str = str .. string.rep( " ", n ) .. text
        DOut( str )
    end
else
    DOut( "Failed to open file :", path )
end