投稿日 | : 2004/07/12(Mon) 12:36 |
投稿者 | : りっとっと |
Eメール | : |
URL | : |
タイトル | : Re^3: バイナリエディタ |
> バイナリオープンしてバイト配列に読み込んだデータを
> 1要素ずつHex関数で変換してTextBoxに書き出せばいいかと。
を作ってみました。
フォームにテキストボックスを配置し、テキストボックスの表示フォントを
等幅フォント(MSゴシックなど)にして、下のプログラムを書いて実行してみてください。
(SJISファイルのみ対応)
Private Sub Form_Load()
Dim bin() As Byte
Dim binLine() As Byte
Dim binData As Byte
Dim cnt As Long
Dim cnt2 As Long
Dim binLen As Long
Dim strData As String
Dim strChar As String
Dim strBinary As String
Dim MultiFlg As Boolean
Open "c:\Boot.INI" For Binary As #1
binLen = LOF(1) - 1
ReDim bin(binLen)
Get #1, , bin
Close #1
For cnt = 0 To (binLen \ 16) + 1
For cnt2 = 0 To 15
If cnt * 16 + cnt2 > binLen Then Exit For
strData = strData & " " & Right("00" & Hex(bin(cnt * 16 + cnt2)), 2)
If cnt2 = 7 Then strData = strData & " _"
Next
ReDim binLine(15)
For cnt2 = 0 To 15
If cnt * 16 + cnt2 > binLen Then Exit For
binData = bin(cnt * 16 + cnt2)
Select Case binData
'改行コードやタブの場合はスペースに変換
Case Asc(vbCr), Asc(vbLf), Asc(vbTab)
binLine(cnt2) = Asc(" ")
'文字列表示部分において一番最後のバイトが2バイト文字の先頭バイト
'のだったら、そのままだと文字化けするので、配列を拡張して
'きちんと2バイトにする
Case &H80 To &H9F, &HE0 To &HEF
If cnt2 = 15 Then
MultiFlg = True
ReDim Preserve binLine(16)
binLine(15) = binData
binLine(16) = bin(cnt * 16 + 16)
Else
binLine(cnt2) = binData
End If
Case Else
'前の行で一番最後のバイトが2バイト文字の先頭バイトだった場合
'すでにこのバイトのデータは表示しているのでスペースにする
If MultiFlg Then
binLine(cnt2) = Asc(" ")
MultiFlg = False
Else
binLine(cnt2) = binData
End If
End Select
Next
strChar = StrConv(binLine, vbUnicode)
'1行データ作成及び連結
strBinary = strBinary & Right("0000000000" & Hex(cnt), 8) & " " & strData & " " & strChar & vbCrLf
strData = ""
strChar = ""
Next
Text1.Text = strBinary
End Sub
Private Sub Form_Resize()
If Me.ScaleWidth <= 0 Then Exit Sub
With Text1
.Left = 0
.Top = 0
.Width = Me.ScaleWidth
.Height = Me.ScaleHeight
End With
End Sub