How can I convert a big-endian hex-variable = '0x41fe89de' into a [single] (float32) variable?
The result has to be 31,8173179626465.
I only know the way with [double] "0x41fe89de", getting the result 1107200478.
How can I convert a big-endian hex-variable = '0x41fe89de' into a [single] (float32) variable?
The result has to be 31,8173179626465.
I only know the way with [double] "0x41fe89de", getting the result 1107200478.
# Input: a string representing a number or big-endian byte sequence
# in hexadecimal form.
$hex = '0x41fe89de'
# Convert the hex input string to a byte array.
$byteArray = [byte[]] ($hex -replace '^0x' -split '(..)' -ne '' -replace '^', '0x')
# Convert from big-endian to little-endian, if necessary, by
# reversing the order of the bytes to match the platform's.
if ([BitConverter]::IsLittleEndian) {
[Array]::Reverse($byteArray)
}
# Convert to a platform-native [single] instance.
[BitConverter]::ToSingle($byteArray, 0)
The above yields 31.81732 (with the default output formatting).
The technique used to convert the hex string to a byte array is explained in this answer.
The conversion of the byte array to a platform-native [single] instance (System.Single) is performed via the System.BitConverter class.
::ToSingle() must be an exact match for the number of bytes that make up the target type; in this case, 4 bytes are required, because [single] is a 32-bit type (4 bytes times 8 bits); if necessary and appropriate, provide an array that is padded with 0 bytes; use an expression such as [System.Runtime.InteropServices.Marshal]::SizeOf([single] 0) to determine the required byte count.