LZString сжатые данные между PHP и Java - PullRequest
1 голос
/ 10 мая 2019

Android-приложение, которое я пишу, получает данные, сжатые с использованием LZString и отправленные как base 64. Я использую эту реализацию для LZString в Java вместе с эту в PHP.Обе эти реализации являются главными рекомендациями , перечисленными здесь автором оригинального порта JavaScript LZW.

Мне было очень непросто понять, почему данные LZString, отправленные с помощью PHP throwдо исключений в Java.После долгих экспериментов и потрёпанных нервов я в конце концов понял, что проблема заключается в очевидном заполнении, которое ожидается в Java и отсутствует в данных, отправляемых из PHP.Возьмите в качестве примера следующие примеры:

Original String being compressed

Бетти купила немного масла, но оно было горьким, поэтому она купила немного лучшего масла, чтобы улучшить горькое масло

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

Реализация PHP LZString выплевывает следующий байтовый массив

69 73 85 119 76 109 67 101 65 69 66 71 68 50 66 88 65 53 103 67 122 78 65 
104 110 65 108 104 43 65 90 110 73 104 67 65 69 55 69 90 55 81 68 117 109 65 
122 114 113 82 102 102 78 80 97 105 72 69 109 104 113 119 76 90 100 89 52 77 
79 85 113 105 75 89 78 118 48 119 66 114 76 109 69 53 77 74 52 115 99 79 90 
65

, в то время как реализация Java генерирует следующий байтовый массив

69 73 85 119 76 109 67 101 65 69 66 71 68 50 66 88 65 53 103 67 122 78 65 
104 110 65 108 104 43 65 90 110 73 104 67 65 69 55 69 90 55 81 68 117 109 65 
122 114 113 82 102 102 78 80 97 105 72 69 109 104 113 119 76 90 100 89 52 77 
79 85 113 105 75 89 78 118 48 119 66 114 76 109 69 53 77 74 52 115 99 79 90 
65 **65 65 61 61**

Вы заметите, что Javaреализация тегов на доп **AA==**.

Я могу в крайнем случае понять, почему существует == - отступ, чтобы получить нужную кратную длину.Однако я не могу понять, почему или откуда АА.

Я протестировал LZString.decompressFromBase64 в Java после добавления тега на AA== и обнаружил, что он работает.С другой стороны, просто пометка на == вызвала исключение.Дальнейший эксперимент показал, что тегирование на ==== работает и так же работает BB==, указывая, что эти четыре байта просто используются для заполнения, а не для какого-либо другого использования.

На этом этапе я мог бы просто добавить дополнениев случае необходимости в Java до выполнения LZString.decompressFromBase64.Однако я боюсь, что это было бы «решением», реализованным без полного понимания происходящего здесь.Может быть, кто-то здесь может пролить свет?

...