2010-06-18 2 views
0

У меня есть 32-разрядное целое число. Битовый поток на самом деле является битовым потоком для 32-битного поплавка (IEEE 754). Я попытался преобразовать его:Преобразование int bytestream в поплавок bytestream

unpack('f', $input); 

Это создает поплавок, но мне кажется, что это не правильный номер

Например, если я прохожу в 1, я должен выходить с 1.4012984e-45 , в соответствии с IEEE754 converter, , но я иду с 2.5638762224389E-9

Большое спасибо за любую помощь/совет.

+1

Usenet на помощь: http://coding.derkeiler.com/Archive/PHP/alt.php/2004-11/0375.html – Wrikken

ответ

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) 
} 

По словам руководства, эти результаты не гарантируется ("F" модификатор в unpack будет зависеть от endianness из система). Но одна вещь - поток байтов, который имеет фактически эти значения, а другой - иметь поток байтов, который происходит, чтобы перевести на «0001», когда рассматривается кодировка ASCII.

+0

Я понимаю, что они не то же самое. Однако вход $, который я передаю, не является строкой, а числом. Я ошибаюсь, полагая, что unpack ('f', 1) и unpack ('f', '\ x01 \ x00 \ x00 \ x00') эквивалентны? (в маленькой системной системе, где будет выполняться этот код (x86/x64)) – Goro

+1

@Goro unpack ожидает строку, поэтому она преобразует номер, который вы передаете в строку. Правила преобразования типов в PHP делают int (1) => string "1". – Artefacto

+1

@Goro Вы можете использовать комбинацию пакетов и распаковки. Это будет работать независимо от того, что система: 'unpack ('f', pack ('L', 1)))' – Artefacto

Смежные вопросы