(Java)我的十六进制解密方法只能解码第一个十六进制值,不能解码完整的字符串

(Java) My hexadecimal decryption method can only decode the first hexadecimal value instead of the full string

我是一名初级程序员,目前正在学习 Java,但我 运行 遇到了一个问题。

最近我一直在研究将字符串与十六进制值相互转换的方法,例如“Hello”到 48656C6C6F,反之亦然。我将输入字符串转换为十六进制值的方法运行良好,我已经对其进行了多次测试,但在完成之后我转向了它的反向方法,使用它我可以将十六进制值转换为字符串,但在出现几次错误之后,测试和重试,我仍然遇到同样的问题。

每当我在控制台中输入一个完整的十六进制代码时,它什么都不做,但是当我只输入单个字符的十六进制值时(例如 7A 代表 z),它工作正常,除了诸如 ' , ., ;, 等 另外,由于 hexDeValue() 方法中我的 switch 语句中的所有字符都具有最少 2 位的十六进制值,因此我尝试将输入字符串的子字符串与两个字符转换为常规字符.正如我提到的,该方法的目的是将十六进制值转换为字符串,所以有人可以建议我应该修复什么吗?

亲切的问候,

这是我的代码:

public class HexDecode {
    public static void main(String[] args) throws InterruptedException {
        while(true) {
            System.out.println("Enter a hexadecimal value");
            String input = TextIO.getlnString();
            System.out.println(hexDe(input));
        }
    }
    
    public static String hexDe(String textout) {
        String output = "";
        String invertedcomma = "'";
        while (true) {
            for(int i = 0; i < textout.length(); i++) {
                
                int j = i+1;
                String hext = textout.substring(i, j);
                
                char smolhext = textout.charAt(i);
                if (smolhext == ' ' ) {
                    output = output + ' ';
                }
                
                if(i%2 == 0) {
                    
                    if (hext == "27") {
                        output = output + invertedcomma;
                    }
                    
                    else {
                        output = output + hexDeValue(textout);
                    }
                    
                    if (hexDeValue(hext) == ' ') {
                        output = output + " ";
                    }
                    
                    if (j > textout.length()) {
                        return output;
                    }
                }
            }
            return output;
        }
    }
    
    public static char hexDeValue(String parameter) {
        
        switch(parameter) {
        case "21":
            return '!';
        case "22":
            return '"';
        case "23":
            return '#';
        case "24":
            return '$';
        case "25":
            return '%';
        case "26":
            return '&';
        case "28":
            return '(';
        case "29":
            return ')';
        case "2A":
            return '*';
        case "2B":
            return '+';
        case "2C":
            return ',';
        case "2D":
            return '-';
        case "2E":
            return '.';
        case "2F":
            return '/';
        case "30":
            return '0';
        case "31":
            return '1';
        case "32":
            return '2';
        case "33":
            return '3';
        case "34":
            return '4';
        case "35":
            return '5';
        case "36":
            return '6';
        case "37":
            return '7';
        case "38":
            return '8';
        case "39":
            return '9';
        case "3A":
            return ':';
        case "3B":
            return ';';
        case "3C":
            return '<';
        case "3D":
            return '=';
        case "3E":
            return '>';
        case "3F":
            return '?';
        case "40":
            return '@';
        case "41":
            return 'A';
        case "42":
            return 'B';
        case "43":
            return 'C';
        case "44":
            return 'D';
        case "45":
            return 'E';
        case "46":
            return 'F';
        case "47":
            return 'G';
        case "48":
            return 'H';
        case "49":
            return 'I';
        case "4A":
            return 'J';
        case "4B":
            return 'K';
        case "4C":
            return 'L';
        case "4D":
            return 'M';
        case "4E":
            return 'N';
        case "4F":
            return 'O';
        case "50":
            return 'P';
        case "51":
            return 'Q';
        case "52":
            return 'R';
        case "53":
            return 'S';
        case "54":
            return 'T';
        case "55":
            return 'U';
        case "56":
            return 'V';
        case "57":
            return 'W';
        case "58":
            return 'X';
        case "59":
            return 'Y';
        case "5A":
            return 'Z';
        case "5B":
            return '[';
        case "5D":
            return ']';
        case "5E":
            return '^';
        case "5F":
            return '_';
        case "60":
            return '`';
        case "61":
            return 'a';
        case "62":
            return 'b';
        case "63":
            return 'c';
        case "64":
            return 'd';
        case "65":
            return 'e';
        case "66":
            return 'f';
        case "67":
            return 'g';
        case "68":
            return 'h';
        case "69":
            return 'i';
        case "6A":
            return 'j';
        case "6B":
            return 'k';
        case "6C":
            return 'l';
        case "6D":
            return 'm';
        case "6E":
            return 'n';
        case "6F":
            return 'o';
        case "70":
            return 'p';
        case "71":
            return 'q';
        case "72":
            return 'r';
        case "73":
            return 's';
        case "74":
            return 't';
        case "75":
            return 'u';
        case "76":
            return 'v';
        case "77":
            return 'w';
        case "78":
            return 'x';
        case "79":
            return 'y';
        case "7A":
            return 'z';
        case "7B":
            return '{';
        case "7C":
            return '|';
        case "7D":
            return '}';
        case "7E":
            return '~';
        default:
            return ' ';
        }
    }
}
enter code here

您的 hexDe() 包含行 output = output + hexDeValue(textout); - 但 hexDeValue(textout) 仅在 textout 包含单个字符的十六进制值(例如“41”)时有效。

如果 textout 包含例如“4142”,则只有 hexDeValue() 中的默认大小写匹配并且 hexDeValue(textout) returns ' '.


问题较多:

if (hext == "27") {
    output = output + invertedcomma;
}

表达式 hext == "27" 只有在 hext 被分配字符串常量“27”时才为真,但如果 hext 是从更长的字符串中提取的,则表达式 hext == "27" 为真细绳。有关详细信息,请参阅 How do I compare strings in Java?

int j = i+1;
String hext = textout.substring(i, j);

这从 textout 中提取长度为 1 的子串。但以下代码仅在 hext 的长度为 2 时有效。


您的代码的一个小问题是您在循环中重复连接字符串。这是非常低效的(尽管对于这么小的问题可能无关紧要),最好使用 StringBuilder:

    StringBuilder output = new StringBuilder();

    // instead of output = output + something; use
    output.append(something);

    // at the end of your method, instead of return output; use
    return output.toString();

如何修复代码

而不是

output = output + hexDeValue(textout);

你的意思可能是

output = output + hexDeValue(hext);

为了正确解码字符,要求 hext 的长度为 2。这意味着您需要在此之前的几行中编写

int j = i+2;
String hext = textout.substring(i, j);

但是如果 i 等于 textout.length()-1.

,这将导致 IndexOutOfBoundsException

我不知道您的代码处理输入中的 space 个字符有多重要。如果输入仅包含一对十六进制字符,那么您可以将循环重写为:

public static String hexDe(String textout) {
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < textout.length(); i += 2) {
        String hext = textout.substring(i, i+2);
        if (hext.equals("27")) {
            output.append(invertedcomma);
        }
        else {
            output.append(hexDeValue(hext));
        }
    }
    return output.toString();
}

如果你添加行

    case "27":
        return '\'';

对于 hexDeValue() 中的 switch 语句,您甚至不需要 hexDe() 方法中 "27" 的特殊情况。