[开源][交流][VB]自己动手编写Hex到Bin的转换工具(使用VB)【恢复】
[原理解析]本人右手小拇指骨折……暂停更新原理部分……
<font color=red>[核心代码]
'------------------------------------------------------------------'
' 函数说明: 从HEX纪录的字符串中获取数据 '
' 输入: 字符串,数据缓冲区 '
' 输出: 读取操作是否成功 '
' 调用函数: 无 '
'------------------------------------------------------------------'
Public Function Get_Date_From_Hex_Item _
( _
strHEXItem As String, _
ByRef chDataBuffer() As Byte, _
ByRef ItemType As Integer, _
ByRef wAddress As Long _
) As Boolean
On Error GoTo Err_Handle:
ReDim chData(0 To 0) As Byte
Dim Size As Integer
Get_Date_From_Hex_Item = False
Dim TempString As String
Dim CheckSum As Integer
Dim CheckSumData As Byte
'数据初始化和有效性检测
strHEXItem = Trim(strHEXItem)
If strHEXItem = "" Then
Exit Function
End If
If Left(strHEXItem, 1) <> ":" Then
Exit Function
End If
CheckSum = 0
'读取HEX纪录中包含的数据大小
TempString = Mid(strHEXItem, 2, 2)
If (Get_Byte_From_ASCII_HEX(TempString, chData(0)) = False) Then
Exit Function
End If
Size = chData(0)
CheckSum = CheckSum + chData(0)
If (Size <> 0) Then
'重新定义数据缓冲区的大小
ReDim chDataBuffer(0 To (Size - 1))
End If
'读取地址
TempString = Mid(strHEXItem, 4, 2)
ReDim chData(0 To 1) As Byte
If (Get_Byte_From_ASCII_HEX(TempString, chData(1)) = False) Then
Exit Function
End If
CheckSum = CheckSum + chData(1)
TempString = Mid(strHEXItem, 6, 2)
If (Get_Byte_From_ASCII_HEX(TempString, chData(0)) = False) Then
Exit Function
End If
CheckSum = CheckSum + chData(0)
Byte_To_Int32 chData(0), wAddress
'读取类型
TempString = Mid(strHEXItem, 8, 2)
If (Get_Byte_From_ASCII_HEX(TempString, chData(0)) = False) Then
Exit Function
End If
CheckSum = CheckSum + chData(0)
ItemType = chData(0)
'读取数据可选
If ItemType = 0 Then
'数据记录
Dim n As Integer
For n = 0 To Size - 1
'读取数据
TempString = Mid(strHEXItem, 10 + n * 2, 2)
If (Get_Byte_From_ASCII_HEX(TempString, chDataBuffer(n)) = False) Then
Exit Function
End If
CheckSum = CheckSum + chDataBuffer(n)
Next n
End If
'读取CheckSum
TempString = Mid(strHEXItem, (5 + Size) * 2, 2)
If (Get_Byte_From_ASCII_HEX(TempString, CheckSumData) = False) Then
Exit Function
End If
Int16_To_Byte CheckSum, chData(0)
'取反
chData(0) = BYTENot(chData(0))
If chData(0) = &HFF Then
If CheckSumData <> 0 Then
Exit Function
End If
Else
chData(0) = chData(0) + 1
If (chData(0) <> CheckSumData) Then
Exit Function
End If
End If
Get_Date_From_Hex_Item = True
Exit Function
'------------------------------------------------------------------'
Err_Handle:
Err.Clear
End Function
'------------------------------------------------------------------'
' 函数说明: 将HEX字符串转换为单个字节 '
' 输入: 字符串,数据缓冲区 '
' 输出: 读取操作是否成功 '
' 调用函数: 无 '
'------------------------------------------------------------------'
Public Function Get_Byte_From_ASCII_HEX(strHEX As String, ByRef chByte As Byte) As Boolean
On Error GoTo Err_Handle:
Dim strTemp As String
strHEX = Trim(strHEX)
strHEX = Left(strHEX, 2)
strTemp = UCase(Left(strHEX, 1))
chByte = 0
Select Case strTemp
Case "0" To "9"
chByte = chByte + Val(strTemp)
Case "A"
chByte = chByte + 10
Case "B"
chByte = chByte + 11
Case "C"
chByte = chByte + 12
Case "D"
chByte = chByte + 13
Case "E"
chByte = chByte + 14
Case "F"
chByte = chByte + 15
Case Else
'无效的字符出现
Get_Byte_From_ASCII_HEX = False
Exit Function
End Select
chByte = chByte * 16
strTemp = UCase(Right(strHEX, 1))
Select Case strTemp
Case "0" To "9"
chByte = chByte + Val(strTemp)
Case "A"
chByte = chByte + 10
Case "B"
chByte = chByte + 11
Case "C"
chByte = chByte + 12
Case "D"
chByte = chByte + 13
Case "E"
chByte = chByte + 14
Case "F"
chByte = chByte + 15
Case Else
'无效的字符出现
Get_Byte_From_ASCII_HEX = False
Exit Function
End Select
Get_Byte_From_ASCII_HEX = True
Exit Function
'------------------------------------------------------------------'
Err_Handle:
Err.Clear
Get_Byte_From_ASCII_HEX = False
End Function
<font color=#699BCD>
本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-10-27,15:37:58. 介绍的这么详细,你可以为人师表了 mark 向傻孩子同志学习!我也是用ICC和VB,VC不懂,呵呵。 to 【13楼】 armok 阿莫
谢谢关心哈。刚刚完成了范例部分,呵呵……算是暂时可以有个交待了。 to 【10楼】 caplsc
好的,马上修改。
to 【11楼】 linxiaolong
不明白你的意思? 最简单的用vb中CommonDialog1控键就可以了! to 傻孩子:
“相关下载 ”那里,
“1、VB为操作扩展动态链接库 BitAccess.dll”
如果我没有理解错的话,其中应该是 "VB 位操作………………”吧,
如果是不知道你写过VB的位操作库的人,估计是很容易迷糊的,希望能修正。 厉害,vb和vc都懂 to 傻孩子:
……那该是我不好意思了,没有仔细看你的代码哈,主要是我不熟VB,所以就没有心思看代码,有时间弄个VC的相同功能的dd玩玩,其实我VC也不怎么熟,不过还是可以尝试着弄弄的。 to 【6楼】 caplsc
不好意思,其实我提供的函数可以同时实现你说的三个功能……
为了演示着两个函数的使用,我后面增加了一个将HEX转换为BIN文件
的工程例子。还有,楼主位有原理讲解部分没有更新……造成误解,
还请原谅。 to 傻孩子:
“所需的数据”就在标题中啊……
我的意思是,你这里说从hex文件中读取所需的数据,是指以下什么情况:
1、提取自己感兴趣的数据
2、仅仅是将hex读取出来
3、其它 to 【2楼】 caplsc
不明白你的意思。你能给我指出具体的位置么?
to 【4楼】 ybx520
呵呵,可惜我不会Delphi哈,而且整个论坛用VB的教程没有Delphi多哈。
AVR方面我是一个使用ICC的顽固分子,上位机方面,我是一个使用VB+VC的顽
固分子。 有delphi的就更好了 我有e语言的,以前用e语言写了个编程器上位软件 这个“所需的数据”不知道具体指什么啊…… [应用范例] 编写一个将HEX转化为Bin的小工具
1、打开VB,新建一个工程,在控件工具箱上,单击右键,选择添加部件。
如图所示,增加一个Common Dialog Control控件,这个工具将方便
我们打开一个HEX文件。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454690.JPG
2、修改窗体属性:
将(名称)修改为:frmMain
将BorderStyle修改为3-Fixed Dialog;
将Caption修改为:Hex to Bin Conversion;
将StartUpPosition修改为:2-屏幕中心
给主窗体添加一个CommonDialog控件、一个TextBox控件、一个CommandButton;
修改CommonDialog的属性:
将(名称)修改为:CommonDlg
修改TextBox控件的属性:
将(名称)修改为txtHexFileName
将BackColor修改为&H00C0FFFF& ——也就是淡黄色
将Appearance修改为0 - Flat
修改字体颜色FontColor为&H00FF0000& ——也就是蓝色
将Text属性中的字符串删除(也就是字符串为空)
修改CommandButton的属性:
(名称)修改为cmdConvert
Caption修改为Convert
调整控件的位置和大小,直到觉得美观为止。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454731.JPG
3、双机TextBox,选择Click事件,输入以下的代码
<font color=blue>
Private Sub txtHexFileName_Click()
On Error GoTo Err_Handle:
CommonDlg.DialogTitle = Open File
CommonDlg.Flags = cdlOFNCreatePrompt Or cdlOFNReadOnly
CommonDlg.CancelError = True
CommonDlg.Filter = Intel Hex File(*.HEX)|*.HEX
CommonDlg.ShowOpen
txtHexFileName.Text = CommonDlg.FileName
Exit Sub
Err_Handle:
Err.Clear
End Sub
按F5运行程序,单击TextBox,将弹出文件打开窗口:
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454830.JPG
选择HEX文件,单击打开,将在TextBox里面看到我们刚才选择的文件路径:
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454850.JPG
4、添加一个模块,并修改模块的属性(名称)为API_Support
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454910.JPG
下载BitAccess.rar,解压缩获得BitAccess.dll,拷贝到该VB工程所在
的目录下面。并在新加入的模块文件(API_Support.bas)中添加代码:
Public Declare Function BYTENot Lib BitAccess.dll (ByVal chData As Byte) As Byte
Public Declare Sub Byte_To_Int16 Lib BitAccess.dll (ByRef chData As Byte, ByRef nInt As Integer)
Public Declare Sub Byte_To_Int32 Lib BitAccess.dll Alias Byte_To_Int16 (ByRef chData As Byte, ByRef nInt As Long)
Public Declare Sub Int16_To_Byte Lib BitAccess.dll (ByRef nInt As Integer, ByRef chData As Byte)
Public Declare Sub Int32_To_Byte Lib BitAccess.dll Alias Int16_To_Byte (ByRef nInt As Long, ByRef chData As Byte)
5、添加一个模块,用于保存我们对HEX进行读写的代码,并将其命名为:HEX_Support。
粘贴楼主位上提供的两个函数到模块文件中。
6、在控件工具箱中单击右键,选择添加部件,在部件列表中选择MicroSoft Windows
Common Controls 6.0 (SP4)。我们要用到其中的控件ProgressBar来显示文件转化
时的进度。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_454990.JPG
在窗体中加入ProgressBar控件http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_455010.JPG
按照图中所示的内容修改ProgressBar的属性:
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_455030.JPG
双机主窗体,添加代码,用于将ProgressBar覆盖到TextBox上,这样,在我们显示进度
条的时候就非常的美观——总不至于凭空冒出来一个进度条吧?
Private Sub Form_Load()
With ProgressBar1
.Top = frmMain.txtHexFileName.Top + 20
.Left = frmMain.txtHexFileName.Left + 20
.Height = frmMain.txtHexFileName.Height - 30
.Width = frmMain.txtHexFileName.Width - 30
.Visible = False
End With
End Sub
7、双击CommandButton,添加以下的代码:
Private Sub cmdConvert_Click()
Dim strBinFileName As String
'防止代码重入
cmdConvert.Enabled = False
'判断文件路径是否有效
Do
If Dir(Trim(txtHexFileName.Text)) = Or Trim(txtHexFileName.Text) = Then
'用户没有选择文件,模拟用户单击了TextBox产生事件
txtHexFileName_Click
Else
Exit Do
End If
Loop
strBinFileName = Trim(txtHexFileName.Text)
strBinFileName = Left(strBinFileName, Len(strBinFileName) - 4) '去掉扩展名
strBinFileName = strBinFileName + .bin
If Hex_To_Bin_Convert(txtHexFileName.Text, strBinFileName, ProgressBar1) = False Then
'操作失败
MsgBox 格式转化失败!, vbCritical, 错误
Else
'操作成功
MsgBox 格式转化成功! + Chr(13) + Chr(10) + strBinFileName + , vbInformation, 提示
End If
'开启按钮功能
cmdConvert.Enabled = True
End Sub
<font color=brown>添加函数Hex_To_Bin_Convert,用于实现将指定的HEX文件转化为指定的
Bin文件
Public Function Hex_To_Bin_Convert _
( _
strHEXFileName As String, _
strBinFileName As String, _
Progress As ProgressBar _
) As Boolean
On Error GoTo Err_Handle:
Dim StringLine As String
Dim dwFileLength As Long
Dim dwSize As Long
Dim RecordType As Integer
Dim wAddress As Long
Dim wWriteAddress As Long
Dim n As Long
Dim chData As Byte
Hex_To_Bin_Convert = False
chData = &HFF
strBinFileName = Trim(strBinFileName)
With Progress
.Enabled = True
.Value = 0
.Visible = True
'打开源文件Hex
Open strHEXFileName For Input As #1
'获取HEX文件的长度
dwFileLength = FileLen(strHEXFileName)
'BIN文件已经存在
If (Dir(strBinFileName) <> ) Then
Name strBinFileName As strBinFileName + Trim(Str(Rnd())) + .BAK
End If
'新建一个文件,如果有老文件存在,则直接覆盖
Open strBinFileName For Output As #2
Close #2
'打开目标Bin文件
Open strBinFileName For Binary As #2
'转化主循环
Do While Not EOF(1)
DoEvents
'从HEX文件中读取一条记录
Line Input #1, StringLine
'--------------------数据处理---------------------'
StringLine = Trim(StringLine)
If Left(StringLine, 1) = : Then
ReDim chDataBuffer(0 To 0) As Byte
'有效的纪录
If Get_Date_From_Hex_Item(StringLine, chDataBuffer, RecordType, wAddress) = True Then
'有效的纪录
'填充数据
If RecordType = 1 Then
Exit Do
End If
While (wWriteAddress <> wAddress)
Put #2, , chData
wWriteAddress = wWriteAddress + 1
Wend
Put #2, , chDataBuffer
wWriteAddress = wWriteAddress + UBound(chDataBuffer) + 1
Else
'无效错误的纪录,自动忽略
End If
End If
'--------------------数据处理---------------------'
dwSize = dwSize + Len(StringLine)
.Value = dwSize * 100 / dwFileLength
Loop
dwSize = dwSize + Len(StringLine)
.Value = dwSize * 100 / dwFileLength
Close #2
Close #1
.Enabled = False
.Visible = False
End With
Hex_To_Bin_Convert = True
Exit Function
Err_Handle:
If Err = 58 Then
Resume Next
Else
Err.Clear
End If
With Progress
.Enabled = False
.Visible = False
End With
Close
End Function
软件完成效果图!
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_456651.JPG
</font>
[其它说明]
Public Declare Function BYTENot Lib BitAccess.dll (ByVal chData As Byte) As Byte
Public Declare Sub Byte_To_Int16 Lib BitAccess.dll (ByRef chData As Byte, ByRef nInt As Integer)
Public Declare Sub Byte_To_Int32 Lib BitAccess.dll Alias Byte_To_Int16 (ByRef chData As Byte, ByRef nInt As Long)
Public Declare Sub Int16_To_Byte Lib BitAccess.dll (ByRef nInt As Integer, ByRef chData As Byte)
Public Declare Sub Int32_To_Byte Lib BitAccess.dll Alias Int16_To_Byte (ByRef nInt As Long, ByRef chData As Byte)
<font color=red>[相关下载]
1、VB位操作扩展动态链接库 <font color=red>BitAccess.dll
点击此处下载 ourdev_454671.rar(文件大小:14K) <font color=green>(原文件名:BitAccess.rar) </font>
2、工程范例
点击此处下载 ourdev_456701.rar(文件大小:55K) <font color=green>(原文件名:Hex2Bin.rar)</font>
3、HEX文件格式规范文本
点击此处下载 ourdev_454930.rar(文件大小:22K) (原文件名:Hexadecimal Object File Format Specification.rar)
本贴被 Gorgon Meducer 编辑过,最后修改时间:2008-10-15,21:13:27. to 【13楼】 armok 阿莫
谢谢关心哈。刚刚完成了范例部分,呵呵……算是暂时可以有个交待了。 to 【10楼】 caplsc
好的,马上修改。
to 【11楼】 linxiaolong
不明白你的意思? to 【6楼】 caplsc
不好意思,其实我提供的函数可以同时实现你说的三个功能……
为了演示着两个函数的使用,我后面增加了一个将HEX转换为BIN文件
的工程例子。还有,楼主位有原理讲解部分没有更新……造成误解,
还请原谅。 to 【2楼】 caplsc
不明白你的意思。你能给我指出具体的位置么?
to 【4楼】 ybx520
呵呵,可惜我不会Delphi哈,而且整个论坛用VB的教程没有Delphi多哈。
AVR方面我是一个使用ICC的顽固分子,上位机方面,我是一个使用VB+VC的顽
固分子。
页:
[1]