2011-01-24 29 views
30

Espero que esto no sea una pregunta tan estúpida, he buscado 5 páginas diferentes de resultados de Google pero no he podido encontrar nada al respecto.Convertir una cadena de hexadecimal en ASCII en Java

Lo que necesito hacer es convertir una cadena que contiene todos los caracteres Hex a ASCII, por ejemplo

String fileName = 

75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000 

Todo camino que he visto hace parece que usted tiene que poner en una matriz en primer lugar. ¿No hay forma de recorrer cada dos y convertirlos?

Respuesta

85

sólo tiene que utilizar un bucle for para pasar por cada par de caracteres de la cadena, convertirlos a un personaje y luego golpear el carácter en el extremo de un constructor de cadena:

public static void main(String[] args) { 
    String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000"; 
    StringBuilder output = new StringBuilder(); 
    for (int i = 0; i < hex.length(); i+=2) { 
     String str = hex.substring(i, i+2); 
     output.append((char)Integer.parseInt(str, 16)); 
    } 
    System.out.println(output); 
} 

Esto da unas líneas a partir de lo siguiente:

uTorrent \ Completo \ nfsuc_ost_by_mustang \ Péndulo-9000 Miles.mp3

Hmmm ... :-)

+76

Esta pregunta gana el premio de "Cuestión más autoincriminatoria del año". –

+1

Ja, ja, buen punto, pero afortunado para mí este archivo es de una vez en vivo, así que estoy en el claro, pero no pensé, ja, ja! Me hizo reír aunque :) – James

+0

Gracias "berry120" que me ha ayudado mucho! :) – James

2

Así como yo lo entiendo, es necesario sacar los sucesivos pares de dígitos hexadecimales, a continuación, decodificar ese número hexadecimal de 2 dígitos y tomar el carbón correspondiente:

String s = "..."; 
StringBuilder sb = new StringBuilder(s.length()/2); 
for (int i = 0; i < s.length(); i+=2) { 
    String hex = "" + s.charAt(i) + s.charAt(i+1); 
    int ival = Integer.parseInt(hex, 16); 
    sb.append((char) ival); 
} 
String string = sb.toString(); 
2
String hexToAscii(String s) { 
    int n = s.length(); 
    StringBuilder sb = new StringBuilder(n/2); 
    for (int i = 0; i < n; i += 2) { 
    char a = s.charAt(i); 
    char b = s.charAt(i + 1); 
    sb.append((char) ((hexToInt(a) << 4) | hexToInt(b))); 
    } 
    return sb.toString(); 
} 

private static int hexToInt(char ch) { 
    if ('a' <= ch && ch <= 'f') { return ch - 'a' + 10; } 
    if ('A' <= ch && ch <= 'F') { return ch - 'A' + 10; } 
    if ('0' <= ch && ch <= '9') { return ch - '0'; } 
    throw new IllegalArgumentException(String.valueOf(ch)); 
} 
1
//%%%%%%%%%%%%%%%%%%%%%% HEX to ASCII %%%%%%%%%%%%%%%%%%%%%% 
public String convertHexToString(String hex){ 

String ascii=""; 
String str; 

// Convert hex string to "even" length 
int rmd,length; 
length=hex.length(); 
rmd =length % 2; 
if(rmd==1) 
hex = "0"+hex; 

    // split into two characters 
    for(int i=0; i<hex.length()-1; i+=2){ 

     //split the hex into pairs 
     String pair = hex.substring(i, (i + 2)); 
     //convert hex to decimal 
     int dec = Integer.parseInt(pair, 16); 
     str=CheckCode(dec); 
     ascii=ascii+" "+str; 
    } 
    return ascii; 
} 

public String CheckCode(int dec){ 
    String str; 

      //convert the decimal to character 
     str = Character.toString((char) dec); 

     if(dec<32 || dec>126 && dec<161) 
      str="n/a"; 
    return str; 
} 
2

la manera más fácil de hacer con javax.xml.bind.DatatypeConverter:

String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000"; 
    byte[] s = DatatypeConverter.parseHexBinary(hex); 
    System.out.println(new String(s)); 
+0

Esta solución da los mismos resultados que la aceptada responder. – LeHill

0

Para este caso, tiene un formato de datos hexadecimal en una matriz int y quiero convertirlos en cadena.

int[] encodeHex = new int[] { 0x48, 0x65, 0x6c, 0x6c, 0x6f }; // Hello encode 
for (int i = 0; i < encodeHex.length; i++) { 
    System.out.print((char) (encodeHex[i])); 
} 
Cuestiones relacionadas