2011-12-27 63 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);