0

我试图让我的程序以这样的方式吐出,这是 HEX 到 ASCII 或字符的转换。只是需要帮助。请告诉我我的 for 循环何时出错。

Please enter the string to convert:  
a+b%3A4865792074686973206973206a7573742061207072616374696365
a b:Hey this is just a practice

但我在下面得到这个:(

Please enter the string to convert: 
a+b%3A4865792074686973206973206a7573742061207072616374696365
a b%3A4865792074686973206973206a7573742061207072616374696365:::::::::::::::::::::::::::::

这是我的代码

public class Unmangle {

    public static void main(String[] args) {

        Scanner webinput = new Scanner(System.in);

        System.out.println("Please enter the string to convert: ");
        String input = webinput.nextLine();
        Unmangle.Unmangler(input);
        String result = Unmangle.Unmangler(input);
        System.out.println(result);

    }

    // For example, unmangle("a+b%3A") should return "a b:".

    public static String Unmangler(String input) {

        // if(input.contains("%"))
        int place = input.indexOf("%");
        StringBuilder outputbuild = new StringBuilder();
        StringBuilder S;

        for (int i = place; i < input.length(); i += 2) {
            String output = input.substring(place + 1, place + 3);
            outputbuild.append((char) Integer.parseInt(output, 16));
        }

        String result = input.replace("+", " ") + outputbuild;

        return result;
    }

}
4

2 回答 2

2
  1. 在你的for循环中,你需要从下一个字母开始,%所以它应该是

    for (int i = place + 1; i < input.length(); i += 2) {
    //           ^^^^^^^^^ 
    
  2. 在迭代中,您应该使用i来确定子字符串的索引,而不是place.
    顺便说一句,因为iplace + 1索引开始不会i+1, i+3但是i, i+2

    String output = input.substring(i , i + 2);
    
  3. %最后的更改是在替换+为空格并包括解码字符串之前只获取部分之前(包括它)

    String result = input.substring(0, place + 1).replace("+", " ") + outputbuild;
    

所以尝试改变你的Unmangler方法

public static String unmangler(String input) {

    StringBuilder outputbuild = new StringBuilder();

    int place = input.indexOf("%");
    for (int i = place + 1; i < input.length(); i += 2) 
        outputbuild.append((char) Integer.parseInt(input.substring(i , i + 2), 16));

    return input.substring(0, place + 1).replace("+", " ") + outputbuild;
}
于 2013-08-25T22:15:25.173 回答
0

我不打算将其作为竞争对手的答案。只是我还没有足够的声誉来发表评论,而且上面的答案缺少一个方面,那就是在 for 循环中你需要 i < input.length() - 1,而不是 i < input.length(),因为当 i 达到 input.length() - 2 时, input.substring(i , i + 2), 16)) 将从索引 i 运行到索引 i + 1,这就是你想要的,因为字符串中最后一个元素的索引是 input.length() - 1。否则你会得到一个 NumberFormatException。

于 2013-08-26T00:16:34.480 回答