Ver Mensaje Individual
  #18 (permalink)  
Antiguo 05/10/2010, 07:26
cmarrero
(Desactivado)
 
Fecha de Ingreso: enero-2008
Ubicación: Mendoza
Mensajes: 458
Antigüedad: 16 años, 9 meses
Puntos: 2
Exclamación Respuesta: Convertir Numeros a Caracteres ASCII

Muchas gracias por la ayuda HackmanC..

Ahora te voy a colocar todo lo que hago con las funciones y los resultados, para que veas cuales son las interpretaciones que hago..

Código PHP:
<?php
$fp 
fopen('niveles.log','rb');
$read fread($fp,463);
fclose($fp);
//Archivo sin convertir
echo 'Archivo sin convertir:<br />';
echo 
$read;
echo 
'<br />';

function 
asciiToHex($ascii) {
    
$hex '';
    for (
$i 0$i strlen($ascii); $i++) {
    
$byte strtoupper(dechex(ord($ascii{$i})));
    
$byte str_repeat('0'strlen($byte)).$byte;
    
$hex.=$byte."";
    }
return 
$hex;
}
//Tomo los valores y los convierto a Hexadecimal
$h asciiToHex($read);
//Archivo Completo
echo 'Archivo completo en hexadecimal:<br />';
echo 
$h;
echo 
'<br />';
echo 
'Fracmentos que debo tomar:<br />';
$matriz $h[0].$h[1].$h[2].$h[3].$h[4].$h[5].$h[6].$h[7];
echo 
'Matriz: '.$matriz;
echo 
'<br />';
$montecaseros $h[40].$h[41].$h[42].$h[43].$h[44].$h[45].$h[46].$h[47];
echo 
'Montecaseros: '.$montecaseros;
echo 
'<br />';
$norte $h[116].$h[117].$h[118].$h[119].$h[120].$h[121].$h[122].$h[123];
echo 
'Norte: '.$norte;
echo 
'<br />';
$sur $h[152].$h[153].$h[154].$h[155].$h[156].$h[157].$h[158].$h[159];
echo 
'Sur: '.$sur;
echo 
'<br />';
$setPoint $h[84].$h[85].$h[86].$h[87].$h[88].$h[89].$h[90].$h[91];
echo 
'setPoint: '.$setPoint;
echo 
'<br />';
$error $h[918].$h[919].$h[920].$h[921].$h[922].$h[923].$h[924].$h[925];
echo 
'Error: '.$error;
echo 
'<br />';

//Ahora convierto a coma Flotante todos los datos hexadecimales que tome anteriormente
function hexa2float($val){
    
$entero hexdec($val);
    
$ascci pack('i'$entero);
    
$float unpack('f'$ascci);

return 
$float[1];
}

$matriz hexa2float($matriz);
echo 
'Matriz: '.$matriz;
echo 
'<br />';
$montecaseros hexa2float($montecaseros);
echo 
'Montecaseros: '.$montecaseros;
echo 
'<br />';
$norte hexa2float($norte);
echo 
'Norte: '.$norte;
echo 
'<br />';
$sur hexa2float($sur);
echo 
'Sur: '.$sur;
echo 
'<br />';
$setPoint hexa2float($setPoint);
echo 
'setPoint: '.$setPoint;
echo 
'<br />';
$error hexa2float($error);
echo 
'Error: '.$error;
echo 
'<br />';


//Ahora redonde los numeros para tener los valores mas claros
echo 'Matriz: '.round($matriz);
echo 
'<br />';
echo 
'Montecaseros: '.round($montecaseros);
echo 
'<br />';
echo 
'Norte: '.round($norte);
echo 
'<br />';
echo 
'Sur: '.round($matriz);
echo 
'<br />';
echo 
'setPoint: '.round($setPoint);
echo 
'<br />';
echo 
'Error: '.round($error);
echo 
'<br />';


//Ahora supongamos que el siguiente numero viene por POST de un form.
$setPoint '40.5';
echo 
'Set Point: '.$setPoint;
echo 
'<br />';

//paso este valor a Hexadecimal para hacer el mismo paso de conversiones que hice anterioremente
function flotante2Hex($val){ 
    
$pack pack('f'$val);
    
$unpack unpack('i'$pack);
    
$dechex dechex($unpack[1]);
    return 
strtoupper($dechex); 
}

$setPoint flotante2Hex($setPoint);
echo 
'Set Point: '.$setPoint;
echo 
'<br />';
//Ahora paso de Hexadecimal a Ascii
function hex2ascii($hex){
    
$ascii='';
    for(
$i=0$i<strlen($hex); $i=$i+2) {
        
$ascii.=chr(hexdec(substr($hex$i2)));
    }
    return(
$ascii);
}
//Ascii del Hexadecimal
$setPoint hex2ascii($setPoint);
echo 
'Set Point: '.$setPoint;
echo 
'<br />';
?>


Y todo esto me resuelve por ejemplo:

Archivo sin convertir:
F oC L/segMontecs QE„!Ñ L/segSet Point QB<% Norte QE$€- L/seg Sur QD¼'% L/seg Saavedra Qmts Sarramea Qmts Error CONTACTOR 1 Error CONTACTOR 2 Corrig. MontecaserosCorrig. Alto Verde Corrigiendo caudal, Error MAX IZQUIERDA Error MAX DERECHA Modo MANUAL Error excede los li_mites. Pase a MANUALPor Favor espere... Proximo error a cor_regir= QÀ˜¬
Archivo completo en hexadecimal:
460C6F43204C2F7365674D6F6E74656373200051458421D120 4C2F73656753657420506F696E74201951423C000025202020 4E6F7274652000514524802D204C2F73656720205375722000 5144BC2725204C2F7365672020202053616176656472612000 51000000006D7473202053617272616D656120005100000000 6D747320204572726F7220434F4E544143544F522031202020 4572726F7220434F4E544143544F5220322020202020202020 20202020202020202020202020202020202020202020202020 20202020202020202020202020202020202020202020202020 2020202020436F727269672E204D6F6E746563617365726F73 436F727269672E20416C746F20566572646520202020202020 202020202020202020202020202020436F7272696769656E64 6F2063617564616C2C204572726F72204D415820495A515549 45524441204572726F72204D41582044455245434841202020 202020204D6F646F20204D414E55414C202020204572726F72 20657863656465206C6F73206C695F6D697465732E20506173 652061204D414E55414C506F72204661766F72206573706572 652E2E2E2050726F78696D6F206572726F72206120636F725F 72656769723D200051C098AC00
Fracmentos que debo tomar:
Matriz: 460C6F43
Montecaseros: 458421D1
Norte: 4524802D
Sur: 44BC2725
setPoint: 423C0000
Error: C098AC00
Matriz: 8987.8154296875
Montecaseros: 4228.2270507812
Norte: 2632.0109863281
Sur: 1505.2232666016
setPoint: 47
Error: -4.77099609375
Matriz: 8988
Montecaseros: 4228
Norte: 2632
Sur: 8988
setPoint: 47
Error: -5
Set Point: 40.5
Set Point: 42220000
Set Point: B"



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...

Saludos