Foros del Web » Programando para Internet » PHP »

Problemas con unpack

Estas en el tema de Problemas con unpack en el foro de PHP en Foros del Web. Hola. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original function binInt ( $bin ) {       $a = unpack ( "I" , $bin ) ; ...
  #1 (permalink)  
Antiguo 06/11/2011, 22:19
 
Fecha de Ingreso: abril-2010
Mensajes: 159
Antigüedad: 14 años
Puntos: 11
Problemas con unpack

Hola.
Código PHP:
Ver original
  1. function binInt($bin)
  2. {
  3.       $a = unpack("I",$bin);
  4.      return $a[1];
  5. }
  6.  
  7. $fp = fopen("archivo.back","rb");
  8. $fr = fread($fp,4);
  9. echo binInt($fr);
  10. fclose($fp);

Ahora el problema es que obtengo diferente desultado con las versiones de PHP.
PHP 5.3.5 => Obtengo el resultado correcto.
PHP 5.2.4 => Obtengo un numero con muchos digitos.

Ahora puedo solucionarlo colocando unpack("C",$bin); en la funcion , pero el problema es que me devuelve solo numero de 2 digitos.

espero entiendan este tipo de programación y me ayuden con estos binarios.
gracias..
  #2 (permalink)  
Antiguo 06/11/2011, 23:00
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Problemas con unpack

Hola.

mmm me da a pensar que el servidor donde estas ejecutando no es el mismo.

¿El servidor donde ejecutas tu script bajo PHP v5.3 es diferente al servidor donde ejecutas tu script bajo PHP v5.2?

Porque el error podría no estar en la versión de PHP si no el tamaño de palabra de los procesadores en los que corre el servidor. 32bits y 64 bits....

mira lee esto primero:
http://mx.php.net/manual/es/function.unpack.php#106041

Y después:

Cita:
Iniciado por php.net/manual/es/function.pack.php
Precaución
Observe que PHP almacena internamente los valores de tipo integer como valores con signo de tamaño dependiente de la máquina (de tipo long de C). Los literales de tipo integer y las operaciones que producen números fuera de los límites del tipo integer serán almacenados como float. Cuando se empaquetan estos floats como integers, primero son convertidos al tipo integer. Esto puede o no puede resultar en el patrón de bytes deseado.

El caso más relevante es cuando se empaquetan números sin signo que serían representables con el tipo integer si fueran sin signo. En sistemas donde el tipo integer tiene un tamaño de 32 bits, la conversión normalmente resultará en el mismo patrón de bytes que si el tipo integer fuera sin signo (aunque esto depende de las conversiones de con signo a sin signo definidas en la implementación, conforme al estándar de C). En sistemas donde el tipo integer tiene un tamaño de 64 bits, el tipo float casi con toda seguridad no tendrá una mantisa suficientemente grande para mantener el valor sin pérdida de precisión. Si esos sistemas también tienen un tipo int de C de 64 bits nativo (al contrario que la mayoría de sistemas basados en UNIX), la única forma de usar el formato de empaquetación I en el rango superior es crear valores integer negativos con la misma representación de bytes que el valor sin signo deseado
Me da que el error va por aquí. Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #3 (permalink)  
Antiguo 07/11/2011, 11:42
 
Fecha de Ingreso: abril-2010
Mensajes: 159
Antigüedad: 14 años
Puntos: 11
Respuesta: Problemas con unpack

Gracias por responder.
el script los estoy probando en mi pc , tengo instalado el Wamp con 2 versiones de PHP.
solo cambio de version el PHP, para ejecutar el script.

Otro caso donde me devuelve diferente resultado es con la funcion bin2hex.
El codigo HEXADECIMAL
PHP 5.3.5 => 25000000.
PHP 5.2.4 => 255c305c305c30.

tambien varia el resultado, probare en algun host para ver que tipo de resultado me daria.
de todas maneras muchas gracias por tu ayuda.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:06.