将一组ASCII字符转换回字符串。

5

我目前有这样一个情况,需要将字符串转换为ASCII字符:

        String str = "are";  // or anything else

        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray())
            sb.append((int)c);

        BigInteger mInt = new BigInteger(sb.toString());
        System.out.println(mInt);

在这种情况下,输出为97114101,我正在苦苦寻找一种方法来反转它,将ASCII字符的字符串转换回字符串,例如"are"。

5个回答

3

你无法使用十进制数进行此操作,因为它们的表示中数字的位数会改变。因此,你将无法区分序列112 511 25以及1 125

但是,你可以强制每个字符占据三个数字。在这种情况下,你可以通过反复除以1000并取余数来恢复数字:

for (char c : str.toCharArray()) {
    String numStr = String.valueOf((int)c);
    while (numStr.length() != 3) numStr = "0"+numStr;
    sb.append(numStr);
}

如果您仅使用UNICODE代码点的ASCII部分,这有些浪费,因为您需要的值大多是两位数。如果您切换到十六进制,所有ASCII代码点都将适合于两个数字:

for (char c : str.toCharArray()) {
    String numStr = Integer.toString(c, 16);
    if (numStr.length() == 1) numStr = "0"+numStr;
    sb.append(numStr);
}
BigInteger mInt = new BigInteger(sb.toString(), 16);

现在你可以使用除以256而不是1000来进行分割。

2
简单的答案是你无法恢复数据,因为你已经丢失了数据。你无法知道每个字符有多少位数字。
你需要在数字之间加上某种分隔符。

2
答案是一个明确的 “不”,您不能通过现有的方法将其取回。
但可以考虑使用整数数组(如果可能),如果您能解释为什么要这样做,那么您可能会得到最佳解决方案。

2

如果您在字符串中使用的所有字符都是双位数ASCII码,则可以做到这一点。例如:"ARE"将给出'658269',您将知道要每次处理两个数字以进行反向操作。问题在于您不知道它是否为双位或三位数字的ASCII码....

但是,如果它完全是字符串值[a-zA-Z],则可以查看双位数是否在范围[65-90]或[97-99]中,否则请取三位数,它应该在范围[100-122]内。

但是毋庸置疑,有更好的方法来解决这个问题。


1

正如其他人所指出的那样,这通常是不可行的。然而,正如其他人所辩称的那样,如果您做出某些限制性的假设,它是可以做到的。除了已经提出的假设外,另一个假设可能是您要转换的字符串都是英文单词。

那么您会知道每个字符在整数中占用2或3个数字。以下代码演示了使用一个函数来检查2个数字是否OK或者您必须考虑3个数字:

public String convertBack(BigInteger bigInteger) {
    StringBuilder buffer = new StringBuilder();

    String digitString = bigInteger.toString();

    for (int to, from = 0; from + 2 <= digitString.length(); from = to) {
        // minimally extract two digits at a time
        to = from + 2;
        char c = (char) Integer.parseInt(digitString.substring(from, to));

        // if two digits are not enough, try 3
        if (!isLegalCharacter(c) && to + 1 <= digitString.length()) {
            to++;
            c = (char) Integer.parseInt(digitString.substring(from, to));
        }

        if (isLegalCharacter(c)) {
            buffer.append(c);
        } else {
            // error, can't convert
            break;
        }
    }

    return buffer.toString();
}

private boolean isLegalCharacter(char c) {
    return c == '\'' || Character.isLetter(c);
}

这个isLegalCharacter方法并不是很强大,但你可以根据需要进行调整。例如,它对于包含变音符号的字符(如"naïveté"中的字符)无法正常工作。
但是如果你知道永远不会遇到这样的情况,上述方法也许适用于你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接