將十六進製字符串轉換為 32 位 IEEE 754 浮點數。這個函數比下面的十六進製到 32 位函數快 2 倍。此函數僅更改數據類型(字符串到 int)一次。此外,此函數是從十六進製到下面的 64 位函數的端口。
<?php
function hexTo32Float($strHex) {
$v = hexdec($strHex);
$x = ($v & ((1 << 23) - 1)) + (1 << 23) * ($v >> 31 | 1);
$exp = ($v >> 23 & 0xFF) - 127;
return $x * pow(2, $exp - 23);
}
?>
<?php
//example
echo hexTo32Float("435cbd70"); // outputs: 220.73999023438
echo hexTo32Float("457F9000"); // outputs: 4089
echo hexTo32Float("2D7F5"); // outputs: 6.00804264307E-39
echo hexTo32Float("0002D7F5"); // outputs: 6.00804264307E-39
echo hexTo32Float("47D9F95E"); // outputs: 111602.734375
?>
這邊也有快速的多種float轉換可以參考:https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
不過上面這個函數有一個問題,就是他不會判斷原始的hex是否為負數數值,如 -0.323
我們可以請chatGPT幫忙處理一下…
所以根據chatgpt的改善 其實也可以修正為
function hexTo32Float($strHex) {
$v = hexdec($strHex);
$x = ($v & ((1 << 23) - 1)) + (1 << 23) * ($v >> 31 & 1) * (-2);
$exp = ($v >> 23 & 0xFF) - 127;
$sign = ($v >> 31 & 1) ? '-' : '';
return $sign . $x * pow(2, $exp - 23);
}
這樣就可以支援原始的hex是否為負數數值了。