2010-06-18 106 views
0

我有一個32位整數。比特流實際上是32比特浮點(IEEE 754)的比特流。我試圖與將其轉換:將int字節流轉換爲浮點字節流

unpack('f', $input); 

這產生一個浮子,但似乎它是不是正確的號碼

例如,如果我通過在1,I應當走出來1.4012984e-45 ,根據IEEE754 converter, ,但我來與2.5638762224389E-9

非常感謝任何幫助/建議。

+1

Usenet來拯救:http://coding.derkeiler.com/Archive/PHP/alt.php/2004-11/0375.html – Wrikken 2010-06-18 22:49:52

回答

0

你困惑的事情:

<?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」。

+0

我明白他們是不一樣的。但是,我傳入的$ input不是一個字符串,而是一個數字。假設unpack('f',1)和unpack('f','\ x01 \ x00 \ x00 \ x00')是否等價,我錯了嗎? (在一個小端系統上,這是運行這個代碼的地方(x86/x64)) – Goro 2010-06-18 23:39:42

+1

@Goro解壓期望一個字符串,所以它將你傳遞給它的數字轉換成一個字符串。 PHP中的類型轉換規則使得int(1)=>字符串「1」。 – Artefacto 2010-06-19 00:41:00

+1

@Goro您可以使用包裝和開箱的組合。無論系統的字節順序如何,這都可以工作:'unpack('f',pack('L',1)))'' – Artefacto 2010-06-19 00:44:10