Расшифруйте и замените шестнадцатеричные значения в строке в Java - PullRequest
1 голос
/ 11 марта 2019

У меня есть строка в Java, которая содержит шестнадцатеричные значения ниже нормальных символов.Это выглядит примерно так:

String s = "Hello\xF6\xE4\xFC\xD6\xC4\xDC\xDF"

Я хочу преобразовать шестнадцатеричные значения в символы, которые они представляют, так что это будет выглядеть так:

"HelloöäüÖÄÜß"

Есть ли способзаменить все шестнадцатеричные значения фактическим символом, который они представляют?

С этим я могу добиться того, чего хочу, но мне нужно сделать одну строку для каждого символа, и она не охватывает неисследованные символы:

indexRequest = indexRequest.replace("\\xF6", "ö");
indexRequest = indexRequest.replace("\\xE4", "ä");
indexRequest = indexRequest.replace("\\xFC", "ü");
indexRequest = indexRequest.replace("\\xD6", "Ö");
indexRequest = indexRequest.replace("\\xC4", "Ä");
indexRequest = indexRequest.replace("\\xDC", "Ü");
indexRequest = indexRequest.replace("\\xDF", "ß");

Ответы [ 4 ]

2 голосов
/ 11 марта 2019
public static void main(String[] args) {
    String s = "Hello\\xF6\\xE4\\xFC\\xD6\\xC4\\xDC\\xDF\\xFF ";

    StringBuffer sb = new StringBuffer();
    Pattern p = Pattern.compile("\\\\x[0-9A-F]+");
    Matcher m = p.matcher(s);
    while(m.find()){           
        String hex = m.group();            //find hex values            
        int    num = Integer.parseInt(hex.replace("\\x", ""), 16);  //parse to int            
        char   bin = (char)num;            // cast int to char
        m.appendReplacement(sb, bin+"");   // replace hex with char         
    }
    m.appendTail(sb);
    System.out.println(sb.toString());
} 
0 голосов
/ 11 марта 2019

Сначала ваша строка не является строкой. Используйте один из них:

String  v = "Hello\\xF6\\xE4\\xFC\\xD6\\xC4\\xDC\\xDF";
String  s = "HelloxF6xE4xFCxD6xC4xDCxDF";
0 голосов
/ 11 марта 2019

Вы можете использовать регулярное выражение [xX][0-9a-fA-F]+, чтобы идентифицировать весь шестнадцатеричный код в вашей строке, преобразовать их в соответствующий символ, используя Integer.parseInt(matcher.group().substring(1), 16), и заменить их в строке.Ниже приведен пример кода для него

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HexToCharacter {
public static void main(String[] args) {
    String s = "HelloxF6xE4xFCxD6xC4xDCxDF";
    StringBuilder sb = new StringBuilder(s);
    Pattern pattern = Pattern.compile("[xX][0-9a-fA-F]+");
    Matcher matcher = pattern.matcher(s);
    while(matcher.find()) {
        int indexOfHexCode = sb.indexOf(matcher.group());
        sb.replace(indexOfHexCode, indexOfHexCode+matcher.group().length(), Character.toString((char)Integer.parseInt(matcher.group().substring(1), 16)));
    }
    System.out.println(sb.toString());
}

}

Я протестировал этот шаблон регулярных выражений, используя вашу строку.Если у вас есть другие тестовые примеры, вам может потребоваться изменить регулярное выражение соответственно

0 голосов
/ 11 марта 2019

Я бы перебрал каждую главу, чтобы найти '\', а затем пропустил один символ и запустил метод со следующими двумя символами. И чем просто использовать код Майкла Берри Вот: Преобразование строки Hex в ASCII в Java

...