我正在尝试制作一个压缩字符串的Java程序。
所以我有大量的从三元字符串生成的。我想通过将数字转换为基数0xFFFF来“压缩”该数字,并且每个数字都是UTF-16字符。问题是当我输出此String,然后尝试将其解压缩并取回数字时,数字不一样。另外,直接通过管道传输来自压缩算法的输出并手动输入它会获得与解压缩算法不同的结果。我还尝试过将输出内容并在解压缩算法中将其粘贴为String文字,但这也不会产生相同的结果。
我尝试使用较小的三进制字符串进行测试,它们似乎可以正常工作,只是有时它们会随机产生与预期不同的输出。我不知道是什么问题。
压缩算法:
import java.io.*;
import java.math.BigInteger;
public class Switch{
public static void main(String[] args)throws IOException{
String str = new BufferedReader(new InputStreamReader(new FileInputStream(FileDescriptor.in))).readLine();
BigInteger x = BigInteger.ZERO;
//input String only contains 'a', 'x', and 'y'
for (int i = str.length() - 1; i >= 0; i --){
x = x.multiply(BigInteger.valueOf(3L));
switch (str.charAt(i)){
case 'a': x = x.add(BigInteger.ONE); break;
case 'x': x = x.add(BigInteger.valueOf(2));
}
}
StringBuilder sb = new StringBuilder();
//compression algorithm here
while (x.signum() > 0){
int point = x.and(BigInteger.valueOf(0xffff)).intValue();
sb.appendCodePointAt(point);
x = x.shiftRight(16);
}
System.out.print(sb.reverse());
}
}
解压缩算法:
import java.math.BigInteger;
import java.io.*;
public class Test{public static void main(String[] a)throws IOException{
BigInteger £=BigInteger.valueOf(3);
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
//in the final product the above string initialization will be replaced with a UTF-16 String literal
BigInteger q = BigInteger.ZERO;
for (int i = 0; i < str.length(); i ++){
q = q.shiftLeft(16);
q = q.add(BigInteger.valueOf(str.codePointAt(i)));
}
//Everything below here works as intended
while(q.compareTo(BigInteger.ONE)>0){System.out.write("axy".charAt((q.mod(£).intValue())));q=q.divide(£);}System.out.println();}}
对于输入字符串
“ aaxaaayyxaaaxaaaaaaayaayaaayyyaaaaaaaaaaaxyaaaaayxxyaaaxaayxayaxaxayyyaaaayaaaaaaxaxaayaaaayxxa”,
我希望输出是完全相同的(压缩然后再解压缩不应更改输入)。但是,我得到的输出是
“ xxyxxxaayxxxyxxxxxaxxaxxxaaaxxxxxaxxxxyaxxxxxayyaxxxyxxayxaxyxyxaaaxxxxaxxxxyxyxxaxxxxayy”
有人知道为什么看起来似乎彼此相反的这两段代码实际上不是吗?