php

[php]將HEX 轉成32bit的float (IEEE-754規範)

將十六進製字符串轉換為 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是否為負數數值了。

Be the First to comment.

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)