2010-06-18 6 views
0

32 비트 정수가 있습니다. 비트 스트림은 실제로 32 비트 부동 소수점 (IEEE 754)에 대한 비트 스트림입니다. 나는 그것을 변환 시도 : 나는 1에 전달하면이 float를 생성int 바이트 스트림을 float 바이트 스트림으로 변환합니다.

unpack('f', $input); 

하지만 올바른 숫자 예를 들어

아닌 것 같다, 나는 1.4012984e-45에 나오는되어야한다 , IEEE754 converter에 따르면, 에 따라 다릅니다. 2.5638762224389E-9

도움/조언을 해주셔서 감사합니다.

+1

구조에 유즈넷 : 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) 
} 

을 제공하는 매뉴얼에 따르면,이 결과가 보장되지 않습니다 (unpack에서 "F"수정이의 endianness에 따라 달라집니다 체계). 하지만 한 가지는 실제로 그 값을 가진 바이트 스트림이고 다른 것은 ASCII 문자 세트가 고려 될 때 "0001"로 변환되는 바이트 스트림을 갖는 것입니다.

+0

나는 그들이 동일하지 않다는 것을 이해합니다. 그러나 내가 전달하는 $ 입력은 문자열이 아니라 숫자입니다. unpack ('f', 1)과 unpack ('f', '\ x01 \ x00 \ x00 \ x00')이 동등하다고 가정 할 때 틀린가요? (이 코드가 실행될 리틀 엔디안 시스템 (x86/x64)) – Goro

+1

@Goro unpack은 문자열을 예상하므로 전달한 숫자를 문자열로 변환합니다. PHP에서 타입 변환 규칙은 int (1) => 문자열 "1"을 만듭니다. – Artefacto

+1

@ 고로 팩과 포장을 조합하여 사용할 수 있습니다. 이것은 시스템의 엔디안 (endianness)에 관계없이 작동합니다 :'unpack ('f', pack ('L', 1)))' – Artefacto

관련 문제