繁体   English   中英

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

[英]Java: How to get a bi-directional numeric representation of a string?

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

提前致谢。

以下通过使用 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());
}

您所描述的是双向加密。 这样的事情可能会帮助你。 如果您特别想要一个数值,另一种方法是存储每个字母的字符代码(ASCII 代码)。 但是,生成的数字会很大(尤其是对于非常长的字符串),您可能无法将其存储在 32 位或 64 位 integer 中。 即使很long也不会帮助你。

更新

根据您的编辑,它说您只需要两个字符,您可以通过在字符串上使用getBytes()来使用 ASCII 代码。 当您需要将其转换回来时,前两位将对应于第一个字符,而后两位将对应于第二个字符。

这在一般意义上是不可能的; 只有 2^64 个 long 值,并且有超过 2^64 个仅由字符 X、Y 和 Q 组成的 64 个字符的字符串。

也许你想要一对 hash 表 A 和 B 和一个柜台; 如果你得到一个字符串,你检查它是否在第一个 hash 表中,如果是,则返回你存储在那里的值,如果不是,那么你设置

A[string]=counter; B[counter]=string; counter=1+counter;

这可以做到,假设您的字符串长度为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值不会将 map 返回到有效的 Unicode(或 UTF-16)字符串(例如,它产生不成对的代理项而不是有效字符)。 但是每个普通字符串都会转换为 int 并返回到相同的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM