1,451
社区成员
发帖
与我相关
我的任务
分享
Public Sub Main()
Debug.Print GetHexText2("C:\test.dat")
End Sub
Private Function GetHexText(ByVal theFileName As String) As String()
Dim Buff As String, LineBuff() As String, OutBuff() As String
Dim tmpI As Long, tmpJ As Long, tmpK As Long, tmpStr() As String
Open theFileName For Binary As #1
Buff = Space(LOF(1)) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(0)
LineBuff = Split(Buff, vbCrLf) '先按行拆分
For tmpI = 0 To UBound(LineBuff) '对每行进行循环处理
If Len(LineBuff(tmpI)) > 12 Then '有效行应该不会小于12个字符
ReDim tmpStr(15)
ReDim Preserve OutBuff(UBound(OutBuff) + 1)
tmpK = 0
Buff = Mid(LineBuff(tmpI), 9, 32) '从第9个字符开始的32个字符,貌似也不变
For tmpJ = 1 To 31 Step 2
tmpStr(tmpK) = Mid(Buff, tmpJ, 2) '每两个字符放到一个数组元素中去
tmpK = tmpK + 1
Next tmpJ
OutBuff(UBound(OutBuff)) = Join(tmpStr, " ") '用JOIN一次性填好
End If
Next tmpI
GetHexText = OutBuff
End Function
Private Function GetHexText2(ByVal theFileName As String) As String
Dim Buff() As Byte '原始数据
Dim lngLen As Long '数据长度
Dim OutBuff() As Byte '目标数组
Dim tmpI As Long '源数据指针
Dim tmpJ As Long '临时变量
Dim tmpK As Long '复制到目标位置指针
Dim tmpStr() As String
Open theFileName For Binary As #1
lngLen = LOF(1) - 1
ReDim Buff(lngLen) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(lngLen) '估计生成的数据跟原始的差不多,因为中间有加空格
tmpI = 0
tmpK = 0
Do While tmpI <= lngLen '对数据进行处理
'判断是否一行的开始,判断":"号
If Buff(tmpI) = 58 Then
'跳过前面8位的地址
tmpI = tmpI + 9
'开始复制8个数据,一个数据占2位
For tmpJ = 1 To 16 Step 2
OutBuff(tmpK) = Buff(tmpI)
OutBuff(tmpK + 1) = Buff(tmpI + 1)
OutBuff(tmpK + 2) = 32 '加一个空格
tmpI = tmpI + 2 '源指针移2
tmpK = tmpK + 3 '目标指针向后移3
Next
'加个回车换行
OutBuff(tmpK) = 10
OutBuff(tmpK + 1) = 13
tmpK = tmpK + 2
'直接到下一行
Call GoNextLine(Buff, tmpI)
Else
'不是":"号,再继续找
tmpI = tmpI + 1
End If
Loop
GetHexText2 = StrConv(OutBuff, vbUnicode)
End Function
'定位到下一行
Private Sub GoNextLine(dat() As Byte, ByRef i As Long)
Dim lngT As Long
lngT = UBound(dat)
Do While i < lngT
If dat(i) = &HD Then
If i + 1 <= lngT Then
If dat(i + 1) = &HA Then
i = i + 1
Exit Do
End If
End If
End If
i = i + 1
Loop
End Sub
Option Explicit
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Public Sub Main()
Dim i As String, J As Long
J = GetTickCount
i = GetHexText("d:\temp\1.txt") '我的方法,8秒左右
MsgBox GetTickCount - J
Debug.Print i
J = GetTickCount
i = GetHexText2("d:\temp\1.txt") 'XMXOXO的方法,1.6秒左右-_-
MsgBox GetTickCount - J
Debug.Print i
End Sub
Private Function GetHexText(ByVal theFileName As String) As String
Dim Buff As String, LineBuff() As String, OutBuff() As String
Dim tmpI As Long, tmpJ As Long, tmpK As Long, tmpStr() As String
Open theFileName For Binary As #1
Buff = Space(LOF(1)) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(0)
LineBuff = Split(Buff, vbCrLf) '先按行拆分
For tmpI = 0 To UBound(LineBuff) '对每行进行循环处理
If Len(LineBuff(tmpI)) > 12 Then '有效行应该不会小于12个字符
ReDim tmpStr(15)
ReDim Preserve OutBuff(UBound(OutBuff) + 1)
tmpK = 0
Buff = Mid(LineBuff(tmpI), 9, 32) '从第9个字符开始的32个字符,貌似也不变
For tmpJ = 1 To 31 Step 2
tmpStr(tmpK) = Mid(Buff, tmpJ, 2) '每两个字符放到一个数组元素中去
tmpK = tmpK + 1
Next tmpJ
OutBuff(UBound(OutBuff)) = Join(tmpStr, " ") '用JOIN一次性填好
End If
Next tmpI
GetHexText = Join(OutBuff, vbCrLf)
End Function
'************* 可爱的分割条
Private Function GetHexText2(ByVal theFileName As String) As String
Dim Buff() As Byte '原始数据
Dim lngLen As Long '数据长度
Dim OutBuff() As Byte '目标数组
Dim tmpI As Long '源数据指针
Dim tmpJ As Long '临时变量
Dim tmpK As Long '复制到目标位置指针
Dim lngDats As Long '数据个数
Open theFileName For Binary As #1
lngLen = LOF(1) - 1
ReDim Buff(lngLen) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(lngLen) '估计生成的数据跟原始的差不多,因为中间有加空格
tmpI = 0
tmpK = 0
lngDats = 0
Do While tmpI <= lngLen '对数据进行处理
'判断是否一行的开始,判断":"号
If Buff(tmpI) = 58 Then
'跳过前面8位的地址
tmpI = tmpI + 9
'开始复制8个数据,一个数据占2位
For tmpJ = 1 To 16 Step 2
OutBuff(tmpK) = Buff(tmpI)
OutBuff(tmpK + 1) = Buff(tmpI + 1)
OutBuff(tmpK + 2) = 32 '加一个空格
tmpI = tmpI + 2 '源指针移2
tmpK = tmpK + 3 '目标指针向后移3
lngDats = lngDats + 1
Next
'输出多少个数据后需要换行?
If lngDats Mod 16 = 0 Then
'加个回车换行
OutBuff(tmpK) = &HD
OutBuff(tmpK + 1) = &HA
tmpK = tmpK + 2
End If
'直接到下一行
Call GoNextLine(Buff, tmpI)
Else
'不是":"号,再继续找
tmpI = tmpI + 1
End If
Loop
ReDim Preserve OutBuff(tmpK)
GetHexText2 = StrConv(OutBuff, vbUnicode)
End Function
'定位到下一行
Private Sub GoNextLine(dat() As Byte, ByRef i As Long)
Dim lngT As Long
lngT = UBound(dat)
Do While i < lngT
If dat(i) = &HD Then
If i + 1 <= lngT Then
If dat(i + 1) = &HA Then
i = i + 1
Exit Do
End If
End If
End If
i = i + 1
Loop
End Sub
Private Function GetHexText2(ByVal theFileName As String) As String
Dim Buff() As Byte '原始数据
Dim lngLen As Long '数据长度
Dim OutBuff() As Byte '目标数组
Dim tmpI As Long '源数据指针
Dim tmpJ As Long '临时变量
Dim tmpK As Long '复制到目标位置指针
Dim lngDats As Long '数据个数
Open theFileName For Binary As #1
lngLen = LOF(1) - 1
ReDim Buff(lngLen) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(lngLen) '估计生成的数据跟原始的差不多,因为中间有加空格
tmpI = 0
tmpK = 0
lngDats = 0
Do While tmpI <= lngLen '对数据进行处理
'判断是否一行的开始,判断":"号
If Buff(tmpI) = 58 Then
'跳过前面8位的地址
tmpI = tmpI + 9
'开始复制8个数据,一个数据占2位
For tmpJ = 1 To 16 Step 2
OutBuff(tmpK) = Buff(tmpI)
OutBuff(tmpK + 1) = Buff(tmpI + 1)
OutBuff(tmpK + 2) = 32 '加一个空格
tmpI = tmpI + 2 '源指针移2
tmpK = tmpK + 3 '目标指针向后移3
lngDats = lngDats + 1
Next
'输出多少个数据后需要换行?
If lngDats Mod 16 = 0 Then
'加个回车换行
OutBuff(tmpK) = &HD
OutBuff(tmpK + 1) = &HA
tmpK = tmpK + 2
End If
'直接到下一行
Call GoNextLine(Buff, tmpI)
Else
'不是":"号,再继续找
tmpI = tmpI + 1
End If
Loop
ReDim Preserve OutBuff(tmpK)
GetHexText2 = StrConv(OutBuff, vbUnicode)
End Function
'定位到下一行
Private Sub GoNextLine(dat() As Byte, ByRef i As Long)
Dim lngT As Long
lngT = UBound(dat)
Do While i < lngT
If dat(i) = &HD Then
If i + 1 <= lngT Then
If dat(i + 1) = &HA Then
i = i + 1
Exit Do
End If
End If
End If
i = i + 1
Loop
End Sub
'添加一个按钮,改一下你HEX文件的路径,就可以测试了.在我这里速度还可以.
Option Explicit
Private Sub Command1_Click()
Dim I() As String, J As Long
I = GetHexText("D:\temp\1.txt")
For J = 1 To UBound(I)
Debug.Print I(J)
Next J
End Sub
Private Function GetHexText(ByVal theFileName As String) As String()
Dim Buff As String, LineBuff() As String, OutBuff() As String
Dim tmpI As Long, tmpJ As Long, tmpK As Long, tmpStr() As String
Open theFileName For Binary As #1
Buff = Space(LOF(1)) '一次性读入.只要文件不大于50M的话就比较快
Get #1, , Buff
Close #1
ReDim OutBuff(0)
LineBuff = Split(Buff, vbCrLf) '先按行拆分
For tmpI = 0 To UBound(LineBuff) '对每行进行循环处理
If Len(LineBuff(tmpI)) > 12 Then '有效行应该不会小于12个字符
ReDim tmpStr(15)
ReDim Preserve OutBuff(UBound(OutBuff) + 1)
tmpK = 0
Buff = Mid(LineBuff(tmpI), 9, 32) '从第9个字符开始的32个字符,貌似也不变
For tmpJ = 1 To 31 Step 2
tmpStr(tmpK) = Mid(Buff, tmpJ, 2) '每两个字符放到一个数组元素中去
tmpK = tmpK + 1
Next tmpJ
OutBuff(UBound(OutBuff)) = Join(tmpStr, " ") '用JOIN一次性填好
End If
Next tmpI
GetHexText = OutBuff
End Function