Есть несколько способов сделать это, наиболее очевидным из которых является Copy Memory API. Некоторое время go, здесь было опубликовано довольно изящное решение: Извлечение битов из числа с плавающей запятой в vba , что позволяет избежать необходимости в API
По сути, вам просто понадобится пара коротких функций:
Option Explicit
Type SingleType
Value As Single
End Type
Type FourBytesType
Value(3) As Byte
End Type
Private Function SingleToBytes(f As Single) As Variant
Dim sngType As SingleType
Dim bytesType As FourBytesType
sngType.Value = f
LSet bytesType = sngType
SingleToBytes = bytesType.Value
End Function
Private Function BytesToHex(bytes As Variant) As String
Dim result As String
Dim i As Long
For i = LBound(bytes) To UBound(bytes)
result = result & IIf(bytes(i) < 16, "0", "") & Hex(bytes(i))
Next
BytesToHex = result
End Function
Если вы хотите проверить порядок байтов и перевернуть массив, то можно добавить что-то вроде следующего, которое использует метку порядка байтов. Я не тестировал его на процессоре с прямым порядком байтов, но я думаю, что он сработает:
Private Function IsLittleEndianProcessor() As Boolean
Const BOM As Single = 1
Const MSB As Byte = 63
Dim bytes() As Byte
Dim n As Long
bytes = SingleToBytes(BOM)
n = UBound(bytes)
IsLittleEndianProcessor = (bytes(n) = MSB)
End Function
Private Function ChangeEndianness(bytes As Variant) As Variant
Dim result() As Byte
Dim n As Long, m As Long
ReDim result(UBound(bytes))
m = UBound(bytes)
For n = LBound(bytes) To UBound(bytes)
result(m) = bytes(n)
m = m - 1
Next
ChangeEndianness = result
End Function
Я не совсем уверен, как вы хотите отображать шестнадцатеричную строку, но вы можете вернуться назад по массиву при необходимости записать шестнадцатеричный код. Пример теста:
Public Sub TestMe()
Dim bytes As Variant
Dim output As String
bytes = SingleToBytes(3.1415)
If Not IsLittleEndianProcessor Then
bytes = ChangeEndianness(bytes)
End If
output = BytesToHex(bytes)
Debug.Print output
End Sub