Извлечение шестнадцатеричных значений из URL-адреса, закодированного в процентах

Скажем, например, у меня есть URL-адрес, содержащий следующий символ в процентах: %80
Это явно не ascii персонаж.
Как было бы возможно преобразовать это значение в соответствующую шестнадцатеричную строку в Java. я попробовал следующее без удачи. Результат должен быть 80.

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

2 ответа

Решение

Лучший способ справиться с этим - проанализировать URL, используя либо java.net.URL или же java.net.URI, а затем используйте соответствующие геттеры для извлечения необходимых вам компонентов. Они позаботятся о декодировании любых% -кодированных частей соответствующим образом.

Проблема с вашей нынешней идеей в том, что %80 не представляет "80", или же 80, Скорее он представляет байт, который в дальнейшем необходимо интерпретировать в контексте кодировки символов URL-адреса. И если кодировка UTF-8, то %80 должен сопровождаться еще одним или двумя байтами, кодированными на%... в противном случае это неправильное представление символа UTF-8.

Я действительно не вижу, что вы пытаетесь. Тем не менее, я попробую.

  • Когда вы получите эту строку: "%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);
    
Другие вопросы по тегам