Java - Como decodificar (o descendodear texto)

 
Vista:
sin imagen de perfil

Como decodificar (o descendodear texto)

Publicado por Jhon (4 intervenciones) el 13/03/2014 21:53:59
Hola foreros,

Soy programador, pero hasta ahora empiezo a estudiar Java y en la empresa me impusieron un requerimiento y me tiene estancado hace dias, si me pudiesen ayudar se los agradezco mucho.

Les cuento. Se requiere implementar un consumidor que escuche un socket UDP, que recibe mensaje de unos STB (Set Top Box), los cuales envían informacion de estado. la informacion llega de la siguiente manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2014-03-13 16:40:18,048 [DEBUG][QoETask] Send JMS message on QoE Topic:
<event version="0503" device-id="368101" id="2A">
  <subevent-list>
    <sub-event id="00">
      <data>KioqKioqIENIQU5ORUwgQ0hBTkdFRCAqKioqKiogCiBwcmV2aW9zID0gODA3MTIsIG5leHQgPSA5MjcwNgA=UyIXsA==</data>
    </sub-event>
    <sub-event id="01">
      <data>AA==</data>
    </sub-event>
    <sub-event id="02">
      <data>AAAEZA==</data>
    </sub-event>
    <sub-event id="03">
      <data></data>
    </sub-event>
    <sub-event id="04">
      <data>AAADBA==</data>
    </sub-event>
  </subevent-list>
</event>

Como veran la informacion que viene en el tag data viene encodeada, el tag del sub-event con id 00, me funciona bien cuando la aplico la funcion base64.decode, pero lo otros no me arrojan la info que deberia.

Adjunto el fragmento de codigo que estoy utilizando, disculpen si ven cosas muy tontas pero como les dije recien estoy empezando a probar el java.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public void onMessage(Message message) {
		      try {
		// Check if the message is text
		         if (message instanceof TextMessage) {
		            TextMessage tm = (TextMessage) message;
		// Get content of message
		            String msg = tm.getText();
 
            InputStream stream = new ByteArrayInputStream(msg.getBytes("UTF-8"));
            String stringMsg = IOUtils.toString(stream, "UTF-8")
 
			String trimmedString = stringMsg.substring(colonPos);
            //System.out.println("(L-91) trimmedString: " + trimmedString);
            System.out.println("(L-84) trimmedString: " + trimmedString.getBytes("UTF-8"));
            InputStream trimmedStream = new ByteArrayInputStream(trimmedString.getBytes("UTF-8"));
 
            // Conventir en objeto DOM
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(trimmedStream);
            //doc.getDocumentElement().normalize();
 
            System.out.println("(L-93) El elemento raíz es: " + doc.getDocumentElement().getNodeName() + " - NodeType: " + doc.getDocumentElement().getNodeType());
            NodeList subEventLists = doc.getElementsByTagName("subevent-list");
            System.out.println("(L-95) subEventLists.item(0) NodeName: " + subEventLists.item(0).getNodeName() + " - NodeType: " + subEventLists.item(0).getNodeType());
            NodeList subEvents = subEventLists.item(0).getChildNodes();
            System.out.println("(L-97) subEvent NodeName: " + subEvents.item(0).getNodeName() + " - NodeType: " + subEvents.item(0).getNodeType());
            System.out.println();
 
            // Procesar mensaje recibido
            for (int j = 0; j < subEvents.getLength(); j ++) {
               NodeList subEvent = subEvents.item(j).getChildNodes();
               Node data = subEvent.item(0);
               System.out.println();
               //System.out.println("(L-53) data NodeName: " + data.getNodeName());
               //System.out.println("(L-54) data NodeType: " + data.getNodeType());
               //System.out.println("(L-55) data getTextContent: " + data.getTextContent());
               // Si es un ELEMENT_NODE
               if (data.getNodeType() == Node.ELEMENT_NODE) {
                  Element elemento = (Element) data;
                  String encodedData = data.getChildNodes().item(0).getNodeValue();
                  System.out.println("(L-111) encoded Data: " + encodedData);
                  //System.out.println("(L-60) element NodeValue: " + elemento.getChildNodes().item(0).getNodeValue());
                  byte[] decodedData = Base64.decodeBase64(encodedData);
                  String subDecodedString = "";
                  String decodedString = StringUtils.newStringUtf8(decodedData).trim();
                  System.out.println("(L-129) decodedString.length(): " + decodedString.length());
                  System.out.println("(L-130) decodedString: " + decodedString);
                  if(decodedString.length() != 0 && decodedString.lastIndexOf("p") != -1){
                     // Buscar si la cadena contiene asteriscos
                     int lastPos = decodedString.lastIndexOf("p");
                     //System.out.println("(L-84) lastPos: " + lastPos + " - decoded Data: " + decodedString);
                     subDecodedString = decodedString.substring(lastPos);
                     // Buscar la posicion del ultimo asterisco         
                  }
               }
            } // end for
        }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

Como decodificar (o descendodear texto)

Publicado por Jhonnathan Emilio Cardona Saineda (328 intervenciones) el 14/03/2014 04:38:18
Hola,
Debes verificar en que formato de codificación están viniendo los otros elementos, ya que yo también puedo visualizar el primer elemento pero los otros no. Utilizo la lib de apache para decodificar.
1
2
3
String contentBase64 = "KioqKioqIENIQU5ORUwgQ0hBTkdFRCAqKioqKiogCiBwcmV2aW9zID0gODA3MTIsIG5leHQgPSA5MjcwNgA=UyIXsA==";
         byte[] attachPDF = Base64.decodeBase64(contentBase64.getBytes());
		System.out.println(new String(attachPDF));
un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como decodificar (o descendodear texto)

Publicado por Tom (1831 intervenciones) el 14/03/2014 09:27:39
¿ Como sabes que no se están decodificando bien ? Lo más probable es que no sean strings, sino arrays de bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Como decodificar (o descendodear texto)

Publicado por Jhon (4 intervenciones) el 14/03/2014 14:18:27
Gracias por responder,

La cuestion es que existe un programa que hicieron en c++, que tambien escucha el socket, y ese si interpreta bien la info lo que llega son unos datos de flujo de video, por ejemplo:

AV_STREAM 23000

Llega una descripcion y un valor en cada tag data, asi como se lee el primer tag que da informacion del canal anterior y el actual. El programa de c++ lo hace bien pero cuando yo lo leo no.

Del script de c++ no tengo fuentes, pero da igual porque tampoco se programar en C.

Además tampoco tengo acceso a la informacion de como la STB está encodeando esos tag, en teoría debería ser el mismo base64 con utf-8, pero no me funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Como decodificar (o descendodear texto)

Publicado por Tom (1831 intervenciones) el 14/03/2014 14:56:02
Pues yo insisto :D
El data del sub-event 01 es 0
El data del sub-event 02 es 1124
El data del sub-event 04 es 772

Si los tratas como array de bytes y luego como int.

No sé si tiene algo que ver o no, pero ¿ 1124 x 772 es un tamaño usado en fotografía digital en Internet ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Como decodificar (o descendodear texto)

Publicado por Jhon (4 intervenciones) el 14/03/2014 16:51:56
uhmm, si te dio esos numeros, eso es lo que necesito, podrias por favor ponerme el fragmento de como lo hiciste.

Lo de las dimensiones podria ser coincidencia, ya que puede ser la informacion de resolucion del canal que se está emitiendo o de la resolucion soportada por el STB.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhonnathan Emilio Cardona Saineda

Como decodificar (o descendodear texto)

Publicado por Jhonnathan Emilio Cardona Saineda (328 intervenciones) el 14/03/2014 17:27:07
Hola, Tom tiene toda la razón y es por eso que yo insisto en saber que tipo de dato te están codificando ya que hasta una Imagen jpg puede venir codificada y para decodificarla, pues los mecanismos sería diferentes.
Si fueran numeros lo que te mandan una forma de hacerlo puede ser:
1
2
3
String contentBase64 = "AAADBA==";
byte[] number = Base64.decodeBase64(contentBase64.getBytes());
System.out.println(new BigInteger(number).intValue());
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Como decodificar (o descendodear texto)

Publicado por Jhon (4 intervenciones) el 14/03/2014 17:37:34
Les agradezco mucho eso era lo que necesitaba.

Me imaginaba que sería algo sencillo, pero mientras aprendo tendré que seguir sufriendo con esto.

Muchas gracias Tom y Jhonnathan.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar