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', 2 - 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, $i, 2)));
}
return($ascii);
}
//Ascii del Hexadecimal
$setPoint = hex2ascii($setPoint);
echo 'Set Point: '.$setPoint;
echo '<br />';
?>
Y todo esto me resuelve por ejemplo:
Archivo sin convertir:
FoC 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