自作関数を読む前に |
---|
ファイル書き換え関数(BinFileEdit) |
---|
BinFileEdit ソースプログラム1
Function BinFileEdit(ByVal FileName As String, ByVal Code As String) As Long On Error GoTo ErrSet 01> Dim StartAddress As Long '書き換えを開始するアドレスを格納 02> Dim EndAddress As Long '書き換えを終了するアドレスを格納 03> Dim Data As String '書き込むデータを一時的に格納 04> Dim PutValue As Byte '書き込えるデータを格納 05> Dim i As Long, j As Long 'カウンタ 06> Dim FileNumber As Long 'ファイル番号 07> '改造コードの種類を判定&処理 08> If InStr(1, Code, ">") Then 09> StartAddress = CLng("&h" & Left(Code, InStr(1, Code, ">") - 1)) 10> EndAddress = CLng("&h" & Mid(Code, InStr(1, Code, ">") + 1, _ InStr(1, Code, "-") - InStr(1, Code, ">") - 1)) 11> Else 12> StartAddress = CLng("&h" & Left(Code, InStr(1, Code, "-") - 1)) 13> EndAddress = StartAddress 14> End If 15> Data = Mid(Code, InStr(1, Code, "-") + 1) 16> '改造コードの1文字目が「S,M,L,$」のいずれかであれば、対応する16進数の文字列に変換する 17> Select Case UCase(Left(Data, 1)) 18> Case "S", "M", "L", "$" 19> Data = DecOrAsciiToHex(Right(Data, Len(Data) - 1), Left(Data, 1)) 20> Case Else 21> End Select 22> If Len(Data) Mod 2 <> 0 Then 23> Data = "0" & Data 24> End If |
BinFileEdit ソースプログラム2
FileNumber = FreeFile '使用可能なファイル番号を取得 Open FileName For Binary As #FileNumber For i = 0 To EndAddress - StartAddress Step Len(Data) / 2 For j = 0 To Len(Data) / 2 - 1 PutValue = CLng("&h" & Mid(Data, j * 2 + 1, 2)) '一度に書き込む値は1バイト(00〜FF)なので、一回に2文字書き込むことになる。 Put #FileNumber, StartAddress + i + j + 1, PutValue Next j Next i Close #FileNumber BinFileEdit = 0 Exit Function ErrSet: BinFileEdit = Err.Number End Function |
16進数の変換 |
---|
DecOrAsciiToHex ソースプログラム
Function DecOrAsciiToHex(ByVal DecOrAsciiData As String, ByVal DataType As String) As String Dim ReturnData As String '戻り値が確定するまでの値を格納 Dim CodeString As String '文字コードに対応するアスキー文字列に変換した16進数を一時的に格納 Dim CodeStringCnt As Integer '何文字目を変換しているか ReturnData = "" '1文字目が、「S,M,L,$」のいずれかであれば、対応する16進数の文字列に変換する Select Case DataType Case "S" ReturnData = BigEToLittleE(Hex(CLng(DecOrAsciiData)), 1) Case "M" ReturnData = BigEToLittleE(Hex(CLng(DecOrAsciiData)), 2) Case "L" ReturnData = BigEToLittleE(Hex(CLng(DecOrAsciiData)), 4) Case "$" For CodeStringCnt = 1 To Len(DecOrAsciiData) CodeString = Hex(Asc(Mid(DecOrAsciiData, CodeStringCnt, 1))) ReturnData = ReturnData & CodeString Next CodeStringCnt Case Else End Select DecOrAsciiToHex = ReturnData End Function |
BigEToLittleE ソースプログラム
Function BigEToLittleE(Src As String, ByVal Keta As Long) As String Dim i As Long 'バイト数を2倍にして、桁数に変換する Keta = Keta * 2 '上位の桁の"0"を補い、桁数を揃える Src = Right(String(Keta, "0") & Src, Keta) For i = Keta - 1 To 1 Step -2 '1バイトずつ左右を反転 BigEToLittleE = BigEToLittleE & Mid(Src, i, 2) Next i End Function |