我需要计算双向字符串的数字表示。例如,如果我有一个字符串“US”,我想要一个算法,当应用于“US”时会生成一个数字X(int或long)。当另一个算法应用于X时,我想得到“美国”。每个字符串由两个字符组成。
提前致谢。
答案 0 :(得分:1)
通过使用DataInputStream和DataOutputStream来读取/写入基础字节数组,可以轻松实现以下功能。
public static void main(String[] args) {
String original = "US";
int i = stringToInt(original);
String copy = intToString(i);
System.out.println("original: "+original);
System.out.println("i: "+i);
System.out.println("copy: "+copy);
}
static int stringToInt(String s) {
byte[] bytes = s.getBytes();
if (bytes.length > 4) {
throw new IllegalArgumentException("String too large to be" +
" stored in an int");
}
byte[] fourBytes = new byte[4];
System.arraycopy(bytes, 0, fourBytes, 0, bytes.length);
try {
return new DataInputStream(new ByteArrayInputStream(fourBytes))
.readInt();
} catch (IOException e) {
throw new RuntimeException("impossible");
}
}
static String intToString(int i) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
new DataOutputStream(byteArrayOutputStream).writeInt(i);
} catch (IOException e) {
throw new RuntimeException("impossible");
}
return new String(byteArrayOutputStream.toByteArray());
}
答案 1 :(得分:0)
您所描述的是双向加密。 this之类的东西可以帮到你。如果您特别想要一个数值,另一种方法是存储每个字母的字符代码(ASCII代码)。但是结果数量会很大(特别是对于很长的字符串),你可能无法将它存储在32位或64位整数中。即使long
也无法帮到你。
<强>更新强>
根据您的编辑说明您只需要两个字符,您可以在字符串上使用getBytes()
来使用ASCII代码。当你需要将它转换回来时,前两个数字将对应于第一个字符,而后两个数字将对应于第二个字符。
答案 2 :(得分:0)
这在一般意义上是不可能的;只有2 ^ 64个长值,并且有超过2 ^ 64个64个字符的字符串,仅包含字符X,Y和Q.
也许你想拥有一对哈希表A和B以及一个计数器;如果给你一个字符串,你检查它是否在第一个哈希表中,如果是,则返回你存储在那里的值,如果没有那么你设置
A[string]=counter; B[counter]=string; counter=1+counter;
答案 3 :(得分:0)
这可以,假设您的字符串长度为2
,即由两个Java char
值组成:
public int toNumber(String s) {
return s.charAt(0) + s.charAt(1) << 16;
}
public String toString(int number) {
return (char)number + "" + (char)(number >> 16);
}
有Unicode字符(数字超过2 16 的字符)不适合单个Java char
,但由两个连续的代理表示(由UTF-16表示)。此算法适用于由这两个代理组成的单字符字符串,但不适用于由多个此类字符组成的较长字符串。
此外,有int
个值不会映射回有效的Unicode(或UTF-16)字符串(例如,它会生成不成对的代理而不是有效字符)。但是每个普通字符串都会转换为int并返回到相同的字符串。