LZString在PHP和Java之间压缩数据

LZString在PHP和Java之间压缩数据,java,php,base64,padding,lzw,Java,Php,Base64,Padding,Lzw,我正在编写的一个Android应用程序获取使用LZString压缩的数据,并作为base 64发送出去。我在Java和PHP中使用for LZString。这两种实现都是LZW原始JavaScript端口的作者的顶级推荐 我很难理解为什么PHP发送的LZString数据会在Java中抛出异常。经过大量的实验和紧张的神经之后,我终于发现问题在于Java中预期的明显的填充,而PHP发送的数据中缺少这种填充。以以下为例 Original String being compressed 贝蒂买了一点黄

我正在编写的一个Android应用程序获取使用LZString压缩的数据,并作为base 64发送出去。我在Java和PHP中使用for LZString。这两种实现都是LZW原始JavaScript端口的作者的顶级推荐

我很难理解为什么PHP发送的LZString数据会在Java中抛出异常。经过大量的实验和紧张的神经之后,我终于发现问题在于Java中预期的明显的填充,而PHP发送的数据中缺少这种填充。以以下为例

Original String being compressed
贝蒂买了一点黄油,但它是苦的,所以她买了一些更好的黄油,使苦的黄油更好

一个我用来测试的句子,因为多次重复很可能会压缩得很好

LZString的PHP实现抛出了以下字节数组

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
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实现生成以下字节数组

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
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**
您将注意到extra
**AA==**
上的Java实现标记

我可以在紧要关头理解为什么有一个
==
-填充来达到所需的长度倍数。不过,我不明白机管局为何而来,又从何而来

在附加的
AA=
标记后,我在Java中测试了
LZString.decompressFromBase64
,发现它可以工作。另一方面,简单地在
==
上标记会引发异常。进一步的实验表明,
==
上的标签有效,
BB==
也有效,这表明这四个字节仅用于填充,不用于任何其他用途


此时,在执行
LZString.decompressFromBase64
之前,我可以非常简单地在Java中添加适当的填充。然而,我担心这将是一个“解决方案”,在没有充分了解这里正在发生什么的情况下实施。也许这里有人可以解释一下?

您正在比较的输出是base64编码的输出。原始字节是什么样子的?他们也不一样吗?我不熟悉Java,但他们实现了自己的base64编码,而不是使用内置或标准库,这似乎很奇怪。显示用于生成数据的代码也会有所帮助。您要比较的输出是base64编码的输出。原始字节是什么样子的?他们也不一样吗?我不熟悉Java,但他们实现了自己的base64编码,而不是使用内置或标准库,这似乎很奇怪。显示用于生成数据的代码也会很有帮助。