📄 parsehex.bas
字号:
Attribute VB_Name = "ParseHEX"
Option Explicit
Public MY As Long
Public BufArr() As Byte
Public MCUlen As Long
Type parsedDataAndAddr
error As String
data As String
addr As Integer
len As Integer
End Type
Public ParsedData() As parsedDataAndAddr
Public HexF As Boolean
Public Function ParseHexString(ByVal HexStr As String) As parsedDataAndAddr
Dim DataBinLen As Integer
Dim DataBin As String
Dim DataHex As String
Dim DataBinAdr As Long
Dim i As Integer
Dim chks As Integer
Dim blenTp As Long
' 1 byte intel hex marking 0x3A , ":"
If Left(HexStr, 1) <> ":" Then
ParseHexString.error = "badHex"
Exit Function
End If
' 2 bytes lenght of data
DataBinLen = Bitwise.HexStrToIntVal(Mid(HexStr, 2, 2))
MY = MY + DataBinLen
' 4 bytes data address
DataBinAdr = Bitwise.HexStrToIntVal(Mid(HexStr, 4, 4))
blenTp = DataBinAdr + DataBinLen
If (blenTp - 1) > Blen Then
Blen = blenTp - 1
End If
' record type "00" normal data, "01" end of file, "02" extended addressing
If Mid(HexStr, 8, 2) = "01" Then
ParseHexString.error = "end"
Exit Function
End If
If Mid(HexStr, 8, 2) = "02" Then
ParseHexString.error = "extended"
Exit Function
End If
If Mid(HexStr, 8, 2) <> "00" Then
ParseHexString.error = "notbindata"
Exit Function
End If
' data from 10 to -- every data byte as 2 bytes hex
DataBin = ""
DataHex = (Mid(HexStr, 10, DataBinLen * 2))
For i = 1 To DataBinLen * 2 Step 2
DataBin = DataBin & Chr(Bitwise.HexStrToIntVal(Mid(DataHex, i, 2)))
Next i
' last two checksum, sum data bytes ++ then 2's complement
chks = 0
For i = 1 To DataBinLen + 4
chks = chks + Bitwise.HexStrToIntVal(Mid(HexStr, i * 2, 2))
Next i
chks = chks And &HFF
chks = &H100 - chks
chks = chks And &HFF
If chks <> Bitwise.HexStrToIntVal(Right(HexStr, 2)) Then
ParseHexString.error = "bcc"
Exit Function
End If
ParseHexString.data = DataBin
ParseHexString.addr = DataBinAdr
ParseHexString.len = DataBinLen
ParseHexString.error = "ok"
End Function
Public Function ParseIntelHexFile() As Boolean
Dim i As Integer
Dim j As Integer
ReDim ParsedData(bufStrPos)
ParseIntelHexFile = False
Blen = 0
For i = 0 To bufStrPos
ParsedData(i) = ParseHexString(stringArr(i))
If ParsedData(i).error = "end" Then
ParseIntelHexFile = True
Exit Function
End If
If ParsedData(i).error <> "ok" Then
MsgError (ParsedData(i).error)
ParseIntelHexFile = False
Exit Function
End If
Next i
End Function
Public Function CreateBinData() As Boolean
Dim i As Integer
Dim j As Integer
Dim bt As Byte
CreateBinData = False
ReDim bytesArr(Blen)
For i = 0 To bufStrPos
For j = 0 To (ParsedData(i).len - 1)
bytesArr(ParsedData(i).addr + j) = Asc(Mid(ParsedData(i).data, j + 1, 1))
Next j
Next i
CreateBinData = True
End Function
Public Sub CopyBinFileToBuf()
Dim i As Long
Blen = fLen
ReDim BufArr(Blen)
For i = 0 To Blen
BufArr(i) = bytesArr(i)
Next i
End Sub
Public Sub DisplayLoadData()
Dim i As Long
Dim j As Long
Dim str As String
frmMAIN.LoadData = ""
For i = 0 To Blen Step 8
str = ""
str = str & Bitwise.IntValToHexStr(i, 4) & ": "
For j = 0 To 7
If (i + j) > (Blen) Then
str = str & " "
Else
str = str & Bitwise.IntValToHexStr(bytesArr(i + j), 2) & " "
End If
Next j
str = str & Chr(13) & Chr(10)
frmMAIN.LoadData = frmMAIN.LoadData & str
Next i
End Sub
Public Sub MsgError(ByVal errStr As String)
Select Case errStr
Case "badHex"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "extended"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "notbindata"
MsgBox "Not a valid intel HEX file", vbCritical, "ccc"
Case "bcc"
MsgBox "Bad checksum in intel HEX file", vbCritical, "ccc"
End Select
End Sub
Public Sub ClearGlobals()
Blen = 0
fLen = 0
ReDim bytesArr(0)
ReDim ParsedData(0)
frmMAIN.LoadData = ""
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -