Java:如何获得字符串的双向数字表示?

时间:2011-07-15 17:04:56

标签: java

我需要计算双向字符串的数字表示。例如,如果我有一个字符串“US”,我想要一个算法,当应用于“US”时会生成一个数字X(int或long)。当另一个算法应用于X时,我想得到“美国”。每个字符串由两个字符组成。

提前致谢。

4 个答案:

答案 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并返回到相同的字符串。