Excel VBA 中的十六进制到 ascii 转换错误
Hex to ascii conversion error in Excel VBA
我发现下面说明的将十六进制转换为 text.It 的函数适用于大多数十六进制到文本的转换,但给出异常结果。
例如十六进制值为:
050003d40201414c4552542d42656c6f772038353435206966204e462054726164657320666f722031352d3230206d696e75746573202c77617463682050414e49432050414e4943207570746f20353439332d2d383437360d0a0d0a53656c6c204549434845522061742032343931302e2e2e73746f706c6f7373732032353
我继续使用 hex2text 函数的结果 = |
正确的结果应该是这样的:
ALERT-Below 8545 if NF Trades for 15-20 minutes ,watch PANIC PANIC upto 5493--8476........
(注:我使用hex2ascii转换网站http://www.rapidtables.com/convert/number/hex-to-ascii.htm获得正确结果)
我的 Hex2text 函数是:
Public Function HexToText(text As Range) As String
Dim i As Integer
Dim DummyStr As String
For i = 1 To Len(text) Step 2
DummyStr = DummyStr & Chr(Val("&H" & (Mid(text, i, 2))))
DoEvents
Next i
HexToText = DummyStr
End Function
正如 Alex 所说,前 6 个字节导致了问题。
您可以通过更改 ForNext 循环从第 13 个字符开始:
For i = 13 To Len(text) Step 2
或者您可以过滤掉任何 ASCII 码低于 32 的字符..
If Val("&H" & (Mid(Text, i, 2))) > 31 Then DummyStr = DummyStr & Chr(Val("&H" & (Mid(Text, i, 2))))
或者将它们替换为(例如)space..
If Val("&H" & (Mid(Text, i, 2))) > 31 Then
DummyStr = DummyStr & Chr(Val("&H" & (Mid(Text, i, 2))))
Else
DummyStr = DummyStr & " "
End If
我发现下面说明的将十六进制转换为 text.It 的函数适用于大多数十六进制到文本的转换,但给出异常结果。
例如十六进制值为:
050003d40201414c4552542d42656c6f772038353435206966204e462054726164657320666f722031352d3230206d696e75746573202c77617463682050414e49432050414e4943207570746f20353439332d2d383437360d0a0d0a53656c6c204549434845522061742032343931302e2e2e73746f706c6f7373732032353
我继续使用 hex2text 函数的结果 = |
正确的结果应该是这样的:
ALERT-Below 8545 if NF Trades for 15-20 minutes ,watch PANIC PANIC upto 5493--8476........
(注:我使用hex2ascii转换网站http://www.rapidtables.com/convert/number/hex-to-ascii.htm获得正确结果)
我的 Hex2text 函数是:
Public Function HexToText(text As Range) As String
Dim i As Integer
Dim DummyStr As String
For i = 1 To Len(text) Step 2
DummyStr = DummyStr & Chr(Val("&H" & (Mid(text, i, 2))))
DoEvents
Next i
HexToText = DummyStr
End Function
正如 Alex 所说,前 6 个字节导致了问题。
您可以通过更改 ForNext 循环从第 13 个字符开始:
For i = 13 To Len(text) Step 2
或者您可以过滤掉任何 ASCII 码低于 32 的字符..
If Val("&H" & (Mid(Text, i, 2))) > 31 Then DummyStr = DummyStr & Chr(Val("&H" & (Mid(Text, i, 2))))
或者将它们替换为(例如)space..
If Val("&H" & (Mid(Text, i, 2))) > 31 Then
DummyStr = DummyStr & Chr(Val("&H" & (Mid(Text, i, 2))))
Else
DummyStr = DummyStr & " "
End If