2011-01-24 127 views
30

我希望這不是一個愚蠢的問題,我已經查看了谷歌搜索結果的5個不同頁面,但一直未能找到任何關於此的信息。在Java中將十六進制字符串轉換爲ASCII碼

我需要做的是轉換包含所有的十六進制字符轉換爲ASCII例如

String fileName = 

75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000 

每次我見過的方式使得它好像你必須把它變成一個數組中第一個字符串。有沒有辦法循環通過每兩個並將其轉換?

回答

85

只需使用一個for循環都要經過每對夫婦的字符串中的字符,將它們轉換爲字符,然後捶字符在一個字符串生成器的結尾:

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); 
} 

這給了幾行開始執行以下操作:

的uTorrent \完成\ nfsuc_ost_by_mustang \擺-9000 Miles.mp3

嗯... :-)

+76

這個問題贏得了「年度最自我排斥問題」獎。 – 2011-01-24 18:46:48

+1

哈哈好點,但幸運的是我這個文件是來自一次活的案例,所以我很清楚,但我沒想到哈哈!讓我笑起來:) – James 2011-01-24 18:54:59

2

所以,據我所知,你需要拉出連續對十六進制數字,然後解碼2個數字的十六進制數,並採取相應的字符:

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

最容易的方法它javax.xml.bind.DatatypeConverter

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

這種情況,我有一個十六進制數據格式轉換成int數組,我想將它們轉換的字符串。

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])); 
} 
相關問題