[英]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.