Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] fallo comunicación JAVA - PHP

Estas en el tema de fallo comunicación JAVA - PHP en el foro de PHP en Foros del Web. Buenas. Llevo rato devanándome los sesos y no encuentro el error que me surge... vamos a ver: Tengo una pequeña función PHP que codifica un ...
  #1 (permalink)  
Antiguo 06/07/2013, 03:18
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
fallo comunicación JAVA - PHP

Buenas.

Llevo rato devanándome los sesos y no encuentro el error que me surge... vamos a ver:

Tengo una pequeña función PHP que codifica un stream de manera simétrica (es decir, luego le puedo aplicar el descifrado con la misma key y funciona).

Esta función puede (normalmente lo hace) devolver caracteres ASCII por encima de 127 (por tanto los trato como UTF-8).

Para ver un ejemplo rápido, aquí un poco de código:

Código PHP:
Ver original
  1. $GCall = new GL('myUser', 'myKey');//instancio la clase
  2.  
  3. $GCall->getToken();//operación intermedia, para obtener autenticación
  4.  
  5. file_put_contents($tempPath, $GCall->query($q));//el resultado de $GCall->query($q) es una cadena codificada, que a fin de cuentas es una consulta a una base de datos (el resultado codificado es un XML)
  6.  
  7. /*
  8. funcionamiento: $GCall->decrypt($url) recibe la URL del fichero codificado - en este caso el que está situado en $tempPath
  9. hace un file_get_contents($url), para obtener el contenido codificado
  10. lo decodifica y lo devuelve
  11. */
  12. file_put_contents($finalPath, $GCall->decrypt('http://miweb.com/temp.dat'));//colocamos en $finalPath el contenido decodificado
  13.  
  14. echo(file_get_contents($finalPath));

Esto me funciona perfectamente; testeado un sinfín de veces.

Dejo un extracto del texto codificado:

Código:
(Codificación ISO-8859-1)
@Bzvr5„mt|jsr@$:4E0(gwdshlppC7ƒ|h69&CA>Muxƒugwu$|pnwyR0pv}
Hasta aquí todo marcha como la seda...

El problema empieza ahora:

Desde JAVA, llamo al codificador, le paso una query, pero al decodificar no lo hace de la manera esperada.

Obviamente el proceso es algo distinto:

Código:
Cuando la llamada es desde JAVA, mi función PHP lo detecta (mediante un parámetro pasado) y el resultado intermedio lo guarda en un fichero con un nombre de conveniencia (es decir, tiene un formato específico).

Al llamar al decodificador, si es una llamada JAVA, obtengo el contenido del fichero anterior, lo decodifico, y lo guardo en un fichero final (también con un nombre de conveniencia).
Sin embargo, el fichero intermedio es diferente...

Código:
(Codificación ISO-8859-1)
@Bzvr5„mt|jsr@$:4E0(gwdshlppC7ƒ|h69&CA>Muxƒugwu$|pnwyR

(Codificación UTF-8)
@Bzvr5„mt|jsr@$:4E0(gwdshlppC7ƒ|h6
Y de ahí ya el XML resultante (como pensaréis) es ilegible...

Veo que el problema es de codificación en mi PHP; cuál es el problema es algo que ya escapa a mí... llevo tantas horas ofuscado con esto que ya no veo que hacer... quizás vosotros veis la solución en un par de minutos...

No se si hará falta algo más de info., en cualquier caso pedid y veré que puedo hacer.

Un saludo
  #2 (permalink)  
Antiguo 06/07/2013, 06:49
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: fallo comunicación JAVA - PHP

Es imposible saber dado que no posteas el codigo de la classe que codifica, ademas, hay infinidad de puntos donde puede fallar. Tendras que se mas especifico, salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 06/07/2013, 12:14
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: fallo comunicación JAVA - PHP

Claro, faltaría más.

Pensé que como solo era un typo de codificación no haría falta el tema de la encriptación...

Clase para codificar/decodificar:

Código PHP:
Ver original
  1. class NGC{
  2.     public function __construct(){}
  3.  
  4.     public function encrypt($data, $pass){
  5.          return $this->mergeData($data, $this->mergeData($pass[0], $pass[1], false), true);
  6.     }
  7.  
  8.     public function decrypt($data, $pass){
  9.          return $this->mergeData($data, $this->mergeData($pass[0], $pass[1], false), false);
  10.     }
  11.  
  12.     private function mergeData($p1, $p2, $e = true){
  13.         $minS = $this->getMinS($this->strToDec($p1), $this->strToDec($p2));
  14.         $maxS = $this->getMaxS($this->strToDec($p1), $this->strToDec($p2));
  15.         $min = count($minS);
  16.         $max = count($maxS);
  17.         $ret = array();
  18.  
  19.         for($i=0;$i<$max;$i++)
  20.             if($e)
  21.                 $ret[] = $maxS[$i]+$minS[($i%$min)];
  22.             else
  23.                 if($minS[($i%$min)]>$maxS[$i])
  24.                     $ret[] = $minS[($i%$min)]-$maxS[$i];
  25.                 else
  26.                     $ret[] = $maxS[$i]-$minS[($i%$min)];
  27.  
  28.         return $ret;
  29.     }
  30.  
  31.     private function getMinS($s1, $s2){
  32.         if(count($s1) > count($s2))
  33.             return $s2;
  34.  
  35.         return $s1;
  36.     }
  37.  
  38.     private function getMaxS($s1, $s2){
  39.         if(count($s1) <= count($s2))
  40.             return $s2;
  41.  
  42.         return $s1;
  43.     }
  44.  
  45.     public function decToStr($s){
  46.         $ret = '';
  47.  
  48.         for($i=0;$i<count($s);$i++)
  49.             $ret .= chr($s[$i]);
  50.  
  51.         return $ret;
  52.     }
  53.  
  54.     private function strToDec($s){
  55.         if(is_array($s))
  56.             return $s;
  57.  
  58.         $ret = array();
  59.  
  60.         for($i=0;$i<strlen($s);$i++)
  61.             $ret[$i] = ord($s[$i]);
  62.  
  63.         return $ret;
  64.     }
  65. }
  66. ?>

Cómo codificar:

Código PHP:
Ver original
  1. funcion encode($data, $pass){
  2.     $n = new NGC();
  3.  
  4.     return $n->decToStr($n->encrypt($data, $pass));
  5. }

Cómo decodificar:

Código PHP:
Ver original
  1. function decode($data, $pass){
  2.     $n = new NGC();
  3.  
  4.     return substr($n->decToStr($n->decrypt($data, $pass)), 0, strlen($data));
  5. }

De esta manera, cuando yo llamo a "$GCall->query($q)", se hace una llamada a encode, y cuando llamo a "$GCall->decrypt()", se hace una llamada a decode.

Espero que esto ayude a resolver el problema de una vez por todas...

Un saludo
  #4 (permalink)  
Antiguo 06/07/2013, 12:39
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: fallo comunicación JAVA - PHP

Pues nope, tendras que comprobar linea por linea con echo() y print_r() para ver donde falla, animo. Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #5 (permalink)  
Antiguo 06/07/2013, 13:20
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: fallo comunicación JAVA - PHP

Pues vaya...

Lo que no entiendo es cómo si yo hago esto:

Código:
query:

//ejecutar query
si es java
  file_put_contents(contenido)
  return ''
sino
  return contenido
y luego a la hora del deco me da mal... en fin, iré mirando.

Gracias de todos modos.
  #6 (permalink)  
Antiguo 06/07/2013, 19:23
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: fallo comunicación JAVA - PHP

Pruebas que yo haria.......

a) Enviar algo en UTF8 distinto y ver como lo cojes del otro lado (Java)
b) Codificar trozos mucho mas cortos de 1 byte y luego pocos bytes y enviar eso... y analizar
c) Ver el Dominio e Imagen en repetidos casos.... o sea... logra mapearse todo o se mapea una parte y quedan agujeros ?
__________________
Salu2!
  #7 (permalink)  
Antiguo 07/07/2013, 01:00
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: fallo comunicación JAVA - PHP

Como pensaba, la solución era una tontería...

Resulta que a la hora de generar el fichero intermedio (cuando se llama desde java) se me olvidó poner una "/", de manera que el fichero no se generaba y estaba todo el rato trabajando sobre el mismo (de ahí que nada funcionara)...

Gracias por vuestro tiempo.
  #8 (permalink)  
Antiguo 07/07/2013, 08:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: fallo comunicación JAVA - PHP

Vale...... pero creeria era mas que obvio que siempre recibias la misma cadena.......
__________________
Salu2!

Etiquetas: fallo, java
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 10:56.