Java Преобразование целого числа в строку Unicode - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать программу на Java, которая сжимает строку.

Итак, у меня есть большое число, сгенерированное из троичной строки.Я хотел бы «сжать» число, преобразовав его в базовый 0xFFFF, и каждая цифра будет символом UTF-16.Проблема в том, что когда я вывожу эту строку, затем пытаюсь ее распаковать и получить число обратно, числа не совпадают.Кроме того, прямая передача выходных данных из алгоритма сжатия и его ввод вручную дает отличный результат от алгоритма распаковки.Я также попытался взять вывод и вставить его как строковый литерал в алгоритме декомпрессии, и это тоже не дало того же результата.

Я пробовал тестировать с меньшими троичными строками, и они, кажется, работают,за исключением иногда, они случайным образом производят результат, отличный от ожидаемогоЯ понятия не имею, в чем проблема.

Алгоритм сжатия:

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();}}

Для входной строки

"aaxaaayyxaaaxaaaaayaayaaayyyaaaaayaaaaxyaaaaayxxyaaaxaayxayaxaxayyyaaaayaaaaxaxaayaaaayxxa",

Я ожидаю, что вывод будет точно таким же (сжимая, а затем не распаковывая ввод), если он не изменяет входные данные, если они не изменяются, то ввод, а не декомпрессия должен произойти;Тем не менее, я получаю вывод

"xxyxxxaayxxxyxxxxxaxxaxxxaaaxxxxxaxxxxyaxxxxxaxyaxxyaxxxxxayyaxxxyxxayxaxyxyxaaaxxxxaxxxxyxyxxaxxxxayy"

Кто-нибудь знает, почему эти два элемента не похожи друг на друга?

...