我有一个从设备读取的输入字符串,它是 32 位浮点值的 ASCII 十六进制表示形式。
我的问题是如何将其转换为单个变量(32 位浮点)以便在我的 Excel VBA 应用程序中进行计算?
我可以轻松地将字符串转换为 32 位 Long(使用 32 位浮点二进制表示)。 仅当它是迈向单身的一步时,这才有用。
Dim strIeee754 As String
Dim lLong As Long
Dim sSingle as Single
strIeee754 = "4048f5c3"
lLong = Val("&H" & "4048f5c3") 'as an integer 1,078,523,331
我还可以使用按位函数来提取分量(符号、指数和尾数)。 再次强调,只有在构建 Single 的过程中才有用。
我从 stackoverflow 9431346 中得到了这个想法,将位模式从 Long(上面)强制复制到 Single 中。 这些行位于我的 Excel Sheet1 模块中。
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
...
CopyMemory sSingle, lLong, 4
但是声明引起了消息
Compile error: Constants, fixed-length strings, arrays, user-defined types and Declare statements not allowed as Public members of object modules
对我的目标有任何帮助,我们表示赞赏。
将所有内容放入标准模块中:
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Function CToSng(lLong As Long) As Single
Dim sSingle As Single
CopyMemory sSingle, lLong, 4
CToSng = sSingle
End Function
Sub TestConv()
Dim strIeee754 As String
Dim lLong As Long
Dim sSingle As Single
strIeee754 = "4048f5c3"
lLong = Val("&H" & strIeee754)
Debug.Print CToSng(lLong)
End Sub