2010-06-18 102 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