2010-06-18 6 views
0

J'ai un entier de 32 bits. Le flux de bits est en fait un flux de bits pour un flottant de 32 bits (IEEE 754). J'ai essayé de le convertir avec:Convertit int bytestream en flux flottant bytestream

unpack('f', $input); 

Cela génère un flotteur, mais il semble que ce n'est pas le bon nombre

Par exemple, si je passe en 1, je devrais sortir avec 1.4012984e-45 , selon le IEEE754 converter, mais je viens avec 2.5638762224389E-9

Merci beaucoup pour toute aide/conseil.

+1

Usenet à la rescousse: http://coding.derkeiler.com/Archive/PHP/alt.php/2004-11/0375.html – Wrikken

Répondre

0

Vous n'êtes plus les choses confuses:

<?php 
$s = "\x01\x00\x00\x00"; 
$t = "0001"; //same as "\x30\x30\x30\x31" 
var_dump(unpack('f', $s)); 
var_dump(unpack('f', $t)); 

donne

 
array(1) { 
    [1]=> 
    float(1.4012984643248E-45) 
} 
array(1) { 
    [1]=> 
    float(2.5638762224389E-9) 
} 

Selon le manuel, ces résultats ne sont pas garantis (le modificateur "f" dans unpack dépendra de la endianness du système). Mais une chose est un flux d'octets qui a réellement ces valeurs et d'autre chose est d'avoir un flux d'octets qui arrive à traduire à "0001" lorsque le jeu de caractères ASCII est considéré.

+0

Je comprends qu'ils ne sont pas les mêmes. Cependant, l'entrée $ que je passe n'est pas une chaîne, mais un nombre. Ai-je tort de supposer que l'unpack ('f', 1) et le déballage ('f', '\ x01 \ x00 \ x00 \ x00') sont équivalents? (sur un petit système endian, où ce code sera exécuté (x86/x64)) – Goro

+1

@Goro décompresser attend une chaîne, donc il convertit le nombre que vous lui passez en une chaîne. Tapez les règles de conversion en PHP make int (1) => string "1". – Artefacto

+1

@Goro Vous pouvez utiliser une combinaison de pack et unpack. Cela fonctionnera indépendamment de l'endianness du système: 'unpack ('f', pack ('L', 1)))' – Artefacto

Questions connexes