[PR] この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


ダンプ

今回はファイルダンプソフトを作ります。
といっても簡単なものなので実用になるかどうかは別ですが…
今回は、コンソールプログラムです。もちろん、できる人はウインドウバージョンでもかまいません。
ファイルはコマンドラインで入力させます。
早速コードです。
'dump.abpで保存すること
#console
#include<vcrt71.sbp>

'コマンドライン分析
Dim cmd As *Byte
Dim cmdlen As Long
Dim fnam[MAX_PATH] As Byte
Dim n As Long,m As Long

cmd
= GetCommandLine()
cmdlen
= strlen(cmd)
cmd
[cmdlen+1] = &h20'番人
For n=0 To cmdlen
   
'スペースを探す
   
If cmd[n-1] = &h20 Then
       
'次のスペースまでをfnamにコピー
       
While cmd[n] = &h20
            n
=n+1
       
Wend
       
While(cmd[n] <> &h20)
            fnam[m]
= cmd[n]
            n
=n+1
            m
=m+1
       
Wend
       
Exit For
   
End If
Next

'ファイルを開きます。
Dim fp As *FILE
Dim fsiz As Long
Dim buf As *Byte
fp
= fopen(fnam , "rb")
If fp = NULL Then
    printf
("%sを開けません" , fnam)
   
exit(0)
EndIf

fseek
(fp , 0 , SEEK_END)
fsiz
= ftell(fp)
fseek
(fp , 0 , SEEK_SET)
   
buf
= malloc(fsiz + 16)
fread
(buf , 1 , fsiz , fp)
fclose
(fp)
'ダンプ
For n=0 To fsiz Step 16
   
'16進数表示
   
For m=n To n+15
       
If m >=fsiz Then buf[m] = 0
        printf
("%02x " , buf[m])
   
Next
   
'文字なら表示
   
For m=n To n+15
       
If buf[m] >= &h20 And buf[m] <= &h7F Then
            printf
("%c" , buf[m])
       
Else
            printf
(".")
       
End If
   
Next        
   
'改行
    printf
(Ex"\r\n")
Next
free
(buf)
exit(0)
以下のように使います。
dump ファイル
自分自身をダンプすると以下のようになります。
dumpの実行結果

少しバージョンアップ

アドレス指定できるようにすると使いやすくなるでしょう。
#console
#include<vcrt71.sbp>

'コマンドライン分析
Sub USAGE()
    printf
(Ex"DUMPER for AB Version 1.1\ndump ファイル [開始 終了]\n")        
   
exit(0)
End Sub

Function GetCmd(cnt As Long,buf As *Byte) As Long
   
Dim cmd As *Byte
   
Dim cmdlen As Long
   
Dim cidx As Long
   
Dim ctmp[MAX_PATH] As Byte
    cmd
= GetCommandLine()
    cmdlen
= strlen(cmd)
    cmd[cmdlen]
= &h20
   
    buf
[0] = 0'初期化

   
'スペースを圧縮
   
For n=0 To cmdlen
       
If cmd[n] = &h20 And  cmd[n+1] = &h20 Then
            memcpy
(VarPtr(cmd[n]) , VarPtr(cmd[n+1]) , cmdlen - n)
            n
=n-1
            cmdlen
=cmdlen-1
       
End If
   
Next
   
   
For n=0 To cmdlen
       
While cmd[n]<>&h20
            ctmp[m]
=cmd[n]
            m
=m+1
            n
=n+1
       
Wend
        ctmp[m]
=0
        m
=0
       
If cidx = cnt Then
            strcpy
(buf , ctmp)
           
Exit For
       
End If
        cidx
= cidx+1
   
Next

End Function
Dim fnam[MAX_PATH] As Byte
Dim tmp[MAX_PATH] As Byte
Dim dstart As Long , dend As Long
Dim n As Long,m As Long

GetCmd
(1 , fnam)
GetCmd
(2 , tmp)
dstart
= atoi(tmp)
GetCmd
(3 , tmp)
dend
= atoi(tmp)

'printf(Ex"[%s] : %d -> %d\n" , fnam , start , end)

'ファイルを開きます。
Dim fp As *FILE
Dim fsiz As Long
Dim buf As *Byte
fp
= fopen(fnam , "rb")
If fp = NULL Then USAGE()

fseek
(fp , 0 , SEEK_END)
fsiz
= ftell(fp)
fseek
(fp , 0 , SEEK_SET)
buf
= malloc(fsiz + 16)
fread
(buf , 1 , fsiz , fp)
fclose
(fp)

'位置を設定
If dstart < 0 or dstart > dend  or  dstart > fsiz Then dstart = 0
If dend <= 0 or dend > fsiz Then dend = fsiz

printf
(Ex"dump : %s : %d -> %d\n------------------------------------\n", _
    fnam
, dstart , dend)

'ダンプ
For n=dstart To dend Step 16
   
'アドレス
    printf
("%6d : " , n)
   
'16進数表示
   
For m=n To n+15
       
If m > dend Then
            printf
("   ")
       
Else
            printf
("%02x " , buf[m])
       
End If
   
Next
   
'文字なら表示
   
For m=n To n+15
       
If m =>dend Then Exit For
       
If buf[m] >= &h20 And buf[m] <= &h7F Then
            printf
("%c" , buf[m])
       
Else
            printf
(".")
       
End If
   
Next        
   
'改行
    printf
(Ex"\r\n")
Next
free
(buf)
exit(0)
使い方は下記の通りです。
dump ファイル [開始 終了]
私の書き方が悪いため、読みにくいと思いますが、勘弁してください。
そんなに難しいところは無いと思います。
今回のプログラムは冗長なので、すっきりさせると大変読みやすくなると思います。
特にコマンドライン解析は、もっと簡単になると思います。