我有一個32位整數。比特流實際上是32比特浮點(IEEE 754)的比特流。我試圖與將其轉換:將int字節流轉換爲浮點字節流
unpack('f', $input);
這產生一個浮子,但似乎它是不是正確的號碼
例如,如果我通過在1,I應當走出來1.4012984e-45 ,根據IEEE754 converter, ,但我來與2.5638762224389E-9
非常感謝任何幫助/建議。
我有一個32位整數。比特流實際上是32比特浮點(IEEE 754)的比特流。我試圖與將其轉換:將int字節流轉換爲浮點字節流
unpack('f', $input);
這產生一個浮子,但似乎它是不是正確的號碼
例如,如果我通過在1,I應當走出來1.4012984e-45 ,根據IEEE754 converter, ,但我來與2.5638762224389E-9
非常感謝任何幫助/建議。
你困惑的事情:
<?php
$s = "\x01\x00\x00\x00";
$t = "0001"; //same as "\x30\x30\x30\x31"
var_dump(unpack('f', $s));
var_dump(unpack('f', $t));
給
array(1) { [1]=> float(1.4012984643248E-45) } array(1) { [1]=> float(2.5638762224389E-9) }
根據手冊,這些結果不能保證(在unpack
的 「F」 修改將取決於在該endianness系統)。但有一點是一個字節流,實際上這些值和其他的東西是有一個字節流,當ASCII字符集被考慮時,恰好轉換爲「0001」。
我明白他們是不一樣的。但是,我傳入的$ input不是一個字符串,而是一個數字。假設unpack('f',1)和unpack('f','\ x01 \ x00 \ x00 \ x00')是否等價,我錯了嗎? (在一個小端系統上,這是運行這個代碼的地方(x86/x64)) – Goro 2010-06-18 23:39:42
@Goro解壓期望一個字符串,所以它將你傳遞給它的數字轉換成一個字符串。 PHP中的類型轉換規則使得int(1)=>字符串「1」。 – Artefacto 2010-06-19 00:41:00
@Goro您可以使用包裝和開箱的組合。無論系統的字節順序如何,這都可以工作:'unpack('f',pack('L',1)))'' – Artefacto 2010-06-19 00:44:10
Usenet來拯救:http://coding.derkeiler.com/Archive/PHP/alt.php/2004-11/0375.html – Wrikken 2010-06-18 22:49:52