解压/压缩 base64 字符串

4

PHP代码:

$txt="John has cat and dog."; //plain text
$txt=base64_encode($txt); //base64 encode
$txt=gzdeflate($txt,9); //best compress
$txt=base64_encode($txt); //base64 encode
print_r($txt); //print it

以下代码返回:

C861zE/KdMqPjPBNjzRyM/B0dyuNcnbKTjJKLgUA

我正在尝试在Java中压缩字符串。
        // Encode a String into bytes
     String inputString = "John has cat and dog.";
     inputString=Base64.encode(inputString);

     byte[] input = inputString.getBytes("UTF-8");

     // Compress the bytes
     byte[] output = new byte[100];
     Deflater compresser = new Deflater();
    //compresser.setLevel(Deflater.BEST_COMPRESSION);
     compresser.setInput(input);
     compresser.finish();
     int compressedDataLength = compresser.deflate(output);     
     String outputString = new String(output, 0, compressedDataLength,"UTF-8");     
     outputString=Base64.encode(outputString);  
     System.out.println(outputString);      

但是打印出来的字符串错误:eD8L

Pz9PP3Q/Pz9NPzRyMz90dys/cnY/TjJKLgUAPygJTA==

正确应该是:

C861zE/KdMqPjPBNjzRyM/B0dyuNcnbKTjJKLgUA

如何修复它?谢谢。


这个 base64 类是来自哪个库? - Nivas
6
在 PHP 和 Java 中的每个步骤,打印出 $txt 的值可能会有所帮助,这样您就可以比较并查看它们在哪个步骤上不同。 - Bill the Lizard
1
在这里支持Bill的建议。确保在压缩后字符串仍然相同......我怀疑它们不是。 - Ben D
在这种情况下最常见的错误是将二进制数据(例如“Deflater”输出)视为字符字符串。它不是字符,而是二进制数据,您必须将其保持为字节流/数组,直到通过Base64编码将其转换为字符。 - Hot Licks
2个回答

9

使用Deflater的方法如下:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
Deflater compresser = new Deflater(Deflater.BEST_COMPRESSION, true);
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(stream, compresser);
deflaterOutputStream.write(input);
deflaterOutputStream.close();
byte[] output = stream.toByteArray();

解压缩压缩文件:

    ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
    Inflater decompresser = new Inflater(true);
    InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream2, decompresser);
    inflaterOutputStream.write(output);
    inflaterOutputStream.close();
    byte[] output2 = stream2.toByteArray();

我正在尝试解压字符串<pre>byte[] B_output =Base64.decode(outputString); ByteArrayOutputStream stream2 = new ByteArrayOutputStream(B_output.length); Inflater decompresser = new Inflater(); decompresser.setInput(B_output); InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream2, decompresser); inflaterOutputStream.write(B_output); inflaterOutputStream.close(); byte[] output2 = stream2.toByteArray(); String o3=output2.toString(); o3 = Base64.decode(o3).toString(); System.out.println(o3); </pre> 但是我得到了“incorrect header check”错误。 - Jarosław Maciejewski
1
嗯...我正在尝试压缩和解压长文本(大小为12,000),但是我遇到了错误:Exception in thread "main" java.util.zip.ZipException: invalid bit length repeat at java.util.zip.InflaterOutputStream.write(Unknown Source) at java.io.FilterOutputStream.write(Unknown Source) at gzip.decode(gzip.java:26) at main.main(main.java:37) 我的代码:http://pastebin.com/BDf95Hu2 - Jarosław Maciejewski
正如@Hot Licks在您的问题中所评论的那样,您不应该将二进制数据包装成字符串,因为您不确定其内容的编码方式。 - Akdeniz
@Akdeniz,你能告诉我如何在Node.js中解压输出吗? - Holasmabre

0
 String outputString = new String(output, 0, compressedDataLength,"UTF-8");     

你正在尝试将一些压缩数据解释为UTF-8字符串。这是不安全的,并且导致编码后的字符串包含了一堆“?”而不是预期的数据。

好的。我从“inputString.getBytes(“UTF-8”)”和“outputString”中删除了UTF-8。我得到的结果是:eJwLzrXMT8p0yo+M8E2PNHIz8HR3K41ydspOMkouBQA/KAlM。 - Jarosław Maciejewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接