Excel VBA中的十六进制到ascii转换错误

Excel VBA中的十六进制到ascii转换错误,vba,excel,hex,chr,Vba,Excel,Hex,Chr,我发现下面的函数用于将十六进制转换为文本。它对大多数十六进制转换为文本都有效,但会给出异常结果 例如,十六进制值为: 050003d40201414c4552542d42656c6f772038353435206966204e462054726164657320666f722031352d3230206d696e75746573202c77617463682050414e49432050414e4943207570746f20353439332d2d383437360d0a0d0a53656c6

我发现下面的函数用于将十六进制转换为文本。它对大多数十六进制转换为文本都有效,但会给出异常结果

例如,十六进制值为:

050003d40201414c4552542d42656c6f772038353435206966204e462054726164657320666f722031352d3230206d696e75746573202c77617463682050414e49432050414e4943207570746f20353439332d2d383437360d0a0d0a53656c6c204549434845522061742032343931302e2e2e73746f706c6f7373732032353
结果我开始使用hex2text函数=|

正确的结果应该是:

ALERT-Below 8545 if NF Trades for 15-20 minutes ,watch PANIC PANIC upto 5493--8476........
(注:我使用hex2ascii转换网站获得正确结果)

我的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))))
或者用(例如)一个空格代替它们

If Val("&H" & (Mid(Text, i, 2))) > 31 Then 
   DummyStr = DummyStr & Chr(Val("&H" & (Mid(Text, i, 2))))
Else
   DummyStr = DummyStr & " "
End If

警报
之前有6个字节,其中一个是
00
),Excel不会在单元格中显示除此之外的任何内容,因此您只能看到前面的字节(不可打印的字节)。如果始终有6字节的标题,则从第13个字符开始读取。