Ver Mensaje Individual
  #19 (permalink)  
Antiguo 05/10/2010, 12:30
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Convertir Numeros a Caracteres ASCII

Hola,

Cita:
Iniciado por cmarrero Ver Mensaje
Mi pregunta ahora, es si esto esta bien, y si un numero de coma flotante tiene 4 bytes, por que cuando a este numero lo guardo en un archivo txt me queda de 1 byte o 2 bytes...
Internamente la computadora no guarda los números flotantes como nosotros los miramos, el valor 40.5 lo guarda en formato binario con 32 dígitos binarios (0/1). Normalmente se usan 4 bytes para los flotantes en la arquitectura de 32 bits, pero depende del hardware y el software. En PHP en x86 de 32 bits son 4.

Posiblemente (si sabes lenguaje C) esto resuelva tu duda,
Acá intenté explicar como se almacena un float en la memoria:
http://www.forosdelweb.com/f96/conve...inaria-738518/

Cita:
Iniciado por cmarrero Ver Mensaje
... Ahora te voy a colocar todo lo que hago con las funciones y los resultados, para que veas cuales son las interpretaciones que hago..
Yo simplifique un poco el código que pusiste solamente para probar, posiblemente te sea de utilidad:

Código PHP:
<?php

$fp 
fopen('niveles.log','rb');
$read fread($fp,463);
fclose($fp);
$h strtoupper(bin2hex($read));

echo <<<EOF
Archivo sin convertir:<br />$read<br />
Archivo completo en hexadecimal:<br />$h<br />
Fracmentos que debo tomar:<br />
EOF;

function 
show($datos) {
    echo <<<EOF
    Matriz: $datos[matriz]<br />
    Montecaseros: $datos
[montecaseros]<br />
    Norte: $datos
[norte]<br />
    Sur: $datos
[sur]<br />
    setPoint: $datos
[setPoint]<br />
    Error: $datos
[error]<br />
EOF;
}

function 
hexa2float($val) {
    
$a hexdec($val);
    
$b pack('i'$a);
    
$c unpack('f'$b);
    return 
$c[1];
}

$datos1 = Array(
    
'matriz' => substr($h08),
    
'montecaseros' => substr($h408),
    
'norte' => substr($h1168),
    
'sur' => substr($h1528),
    
'setPoint' => substr($h848),
    
'error' => substr($h9188)
);
show($datos1);

$datos2 = Array();
foreach (
$datos1 as $key => $val)
    
$datos2[$key] = hexa2float($val);
show($datos2);

$datos3 = Array();
foreach (
$datos2 as $key => $val)
    
$datos3[$key] = round($val);
show($datos3);


$f = (float)'40.5';
$g pack('f'$f);
echo 
$g;
?>
La función hexa2float la dejé así como la tenías porque creo que te funciona correctamente como lo necesitas, pero es una situación de interpretación, yo lo interpreto de otra forma porque no sé exactamente en que lo vas a usar, es decir yo puedo decir que está bien o mal según mi criterio nada mas.

Cita:
Iniciado por cmarrero Ver Mensaje
//Ahora supongamos que el siguiente numero viene por POST de un form.
$setPoint = '40.5';
echo 'Set Point: '.$setPoint;
echo '<br />';
En esta última parte creo que estas confundiendo el concepto de 'que es un número decimal (float) y que es un número en string que representa un número decimal. Para representar ese número en 'float' solo lo tienes que empaquetar en un float.

Código PHP:
$f = (float)'40.5';
$g pack('f'$f);
echo 
$g// El ASCII que representa el 40.5 en float en little endian.
//  "B 
Acá posiblemente existe un problema con el endianess, que significa el orden de los bytes, las computadoras guardan los float en 4 bytes en el x86 de 32 bits, pero los 2 primeros son los últimos en otras arquitecturas.

Saludos,