我有一个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