我目前的情况是将字符串转换为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字符串转换回字符串,例如“是”
答案 0 :(得分:3)
您不能使用十进制数字,因为其表示中的位数会发生变化。因此,您无法将序列112 5
与11 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。
答案 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é”这个词中。
但如果您知道您将永远不会遇到此类情况,则上述方法可能对您有用。