2011-12-27 100 views
0

比方說,例如,我的URL包含以下百分比編碼字符:%80
它顯然不是ascii字符。
如何將此值轉換爲Java中相應的十六進制字符串? 我想沒有luck.Result以下應該是80從編碼百分比的URL中提取十六進制值

public static void main(String[] args) { 
     System.out.print(byteArrayToHexString(URLDecoder.decode("%80","UTF-8").getBytes())); 
    } 
    public static String byteArrayToHexString(byte[] bytes) 
    { 
     StringBuffer buffer = new StringBuffer(); 
     for(int i=0; i<bytes.length; i++) 
     { 
     if(((int)bytes[i] & 0xff) < 0x10) 
     buffer.append("0"); 
     buffer.append(Long.toString((int) bytes[i] & 0xff, 16)); 
     } 
     return buffer.toString(); 
    } 
+0

如果是你需要的'80',爲什麼不去掉百分號?順便說一句,你需要什麼? - 此外,請注意,Java字符是16位,即您將得到2個字節,並且根據字符,這兩個字節可能不爲零(即不是0x00)。 – Thomas 2011-12-27 14:02:35

+0

我需要從kannel中提取二進制SMS的內容,URL以以下格式發送:http:// localhost:8080/rest/MO?source_no = 13013&dest_no =%2B2304232381&message =%00 +%11%15% 00%15%00%00%00%00%81S%16%FCG%D9%89%B8lQi%8D%EA%D6%F2%C1%7B%01%3DL%D9%1B%B4&UDH =%02P% 00'我需要解碼消息參數。有些字符是HEX,其他字符是ASCII。我認爲URLDecoder將能夠做到這一點。你說得對,我可以實現這一點,但我想知道是否有任何功能可以解決這個問題。 – krishnen 2011-12-27 14:11:47

+0

那些非ascii參數不是某些十六進制字符串的一部分,那麼爲什麼要將它轉換爲十六進制呢?只需使用'URLDecoder.decode(...)',即可。我沒有看到再次將'€'('%80')轉換爲十六進制字符串的感覺。 – Thomas 2011-12-27 14:33:54

回答

3

來處理,這是使用兩種java.net.URLjava.net.URI解析URL,然後用最好的方式相關的獲取器來提取您需要的組件。這些將以合適的方式解碼任何%編碼部分。

您當前的想法存在的問題是%80並不代表"80"80。相反,它表示一個字節,需要在URL的字符編碼的上下文中進一步解釋。如果編碼是UTF-8,那麼%80需要後面跟着一個或兩個%編碼的字節......否則這是一個畸形的UTF-8字符表示。

1

我實在不明白你想什麼。不過,我會試一試。

  • 當你有這個字符串:"%80"並希望得到"80",你可以使用這樣的:如果你想提取

    String str = "%80"; 
    String hex = str.substring(1); // Cut off the '%' 
    
  • 0x80 (這是十進制的128):

    String str = "%80"; 
    String hex = str.substring(1); // Cut off the '%' 
    int value = Integer.parseInt(hex, 16); 
    
  • 如果你想爲int轉換爲十六進制數使用此:

    String hexRepresenation = Integer.toString(value, 16);