将ascii字符集转换回字符串

时间:2013-12-14 11:23:08

标签: java string type-conversion ascii long-integer

我目前的情况是将字符串转换为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字符串转换回字符串,例如“是”

5 个答案:

答案 0 :(得分:3)

您不能使用十进制数字,因为其表示中的位数会发生变化。因此,您无法将序列112 511 251 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。

答案 1 :(得分:2)

简单的答案是你不能丢失数据。你无法知道每个角色有多少位数。

您需要在数字之间使用某种分隔符。

答案 2 :(得分:2)

答案是一个很大的,你无法用现有方法取回它。

相反,你可以有一个整数数组(如果可能的话, )。如果您解释为什么实际这样做,您可能会得到最佳解决方案。

答案 3 :(得分:2)

如果您在字符串中使用的所有字符都是两位数的ASCIS,那么这可能是可行的。例如:“ARE”会给出'658269',你会知道一次两个数字来反转它。这里的问题是你现在不知道是ASCI代码的双倍还是三位数....

但是,如果它纯粹是字符串值[a-zA-Z],你可以看到双位数是否在[65-90]或[97-99]范围内,否则取三位数它应该是在[100-122]

范围内

但不言而喻,有更好的方法可以做到这一点。

答案 4 :(得分:1)

正如其他人所指出的那样,一般是不可行的。然而,正如其他人也认为的那样,如果你做出某些限制性假设,这是可行的。除了已经提出的那些,另一个假设可能是你要转换的字符串都是英文单词。

然后你会知道每个字符占整数的2或3位数。以下代码举例说明了使用检查2位数是否正常的函数或是否必须考虑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é”这个词中。

但如果您知道您将永远不会遇到此类情况,则上述方法可能对您有用。