gpt4 book ai didi

java - GZIP解压字符串和字节转换

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:32 26 4
gpt4 key购买 nike

我的代码有问题:

private static String compress(String str)
{
String str1 = null;
ByteArrayOutputStream bos = null;
try
{
bos = new ByteArrayOutputStream();
BufferedOutputStream dest = null;

byte b[] = str.getBytes();
GZIPOutputStream gz = new GZIPOutputStream(bos,b.length);
gz.write(b,0,b.length);
bos.close();
gz.close();

}
catch(Exception e) {
System.out.println(e);
e.printStackTrace();
}
byte b1[] = bos.toByteArray();
return new String(b1);
}

private static String deCompress(String str)
{
String s1 = null;

try
{
byte b[] = str.getBytes();
InputStream bais = new ByteArrayInputStream(b);
GZIPInputStream gs = new GZIPInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int numBytesRead = 0;
byte [] tempBytes = new byte[6000];
try
{
while ((numBytesRead = gs.read(tempBytes, 0, tempBytes.length)) != -1)
{
baos.write(tempBytes, 0, numBytesRead);
}

s1 = new String(baos.toByteArray());
s1= baos.toString();
}
catch(ZipException e)
{
e.printStackTrace();
}
}
catch(Exception e) {
e.printStackTrace();
}
return s1;
}

public String test() throws Exception
{
String str = "teststring";
String cmpr = compress(str);
String dcmpr = deCompress(cmpr);
}

此代码抛出 java.io.IOException:未知格式(魔数(Magic Number) ef1f)

GZIPInputStream gs = new GZIPInputStream(bais);

事实证明,在转换字节 new String (b1) 时,byte b[] = str.getBytes () 字节被“破坏”了。在该行的输出处,我们已经有了更多的字节。如果您避免转换为字符串并在字节线上工作 - 一切正常。对不起我的英语。


public String unZip(String zipped) throws DataFormatException, IOException {
byte[] bytes = zipped.getBytes("WINDOWS-1251");
Inflater decompressed = new Inflater();
decompressed.setInput(bytes);

byte[] result = new byte[100];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

while (decompressed.inflate(result) != 0)
buffer.write(result);

decompressed.end();

return new String(buffer.toByteArray(), charset);
}

我使用这个函数来解压缩服务器响应。感谢您的帮助。

最佳答案

你有两个问题:

  • 您正在使用默认字符编码将原始字符串转换为字节。这将因平台而异。最好指定编码 - UTF-8 通常是个好主意。
  • 您试图通过调用 String(byte[]) 构造函数将压缩结果的不透明二进制数据表示为字符串。该构造函数 用于编码文本的数据...但事实并非如此。你应该为此使用 base64。有一个 public domain base64 library这使得这很容易。 (或者,根本不要将压缩数据转换为文本 - 只需返回一个字节数组。)

从根本上说,您需要了解文本数据和二进制数据有何不同 - 当您想要在两者之间进行转换时,您应该谨慎行事。如果您想在字符串中表示“非文本”二进制数据(即 不是 编码文本的直接结果的字节),您应该使用 base64 或 hex 之类的东西。当你想将字符串编码为二进制数据时(例如,将一些文本写入磁盘),你应该仔细考虑使用哪种编码。如果另一个程序要读取您的数据,您需要弄清楚它期望的编码方式 - 如果您自己可以完全控制它,我通常会选择 UTF-8。

此外,您代码中的异常处理很差:

  • 你几乎不应该捕获Exception;捕获更具体的异常
  • 您不应该只是捕捉到异常并继续处理,就好像它从未发生过一样。如果您不能真正处理异常并仍然成功完成您的方法,您应该让异常在堆栈中冒泡(或者可能捕获它并将其包装在更适合您的抽象的异常类型中)

关于java - GZIP解压字符串和字节转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com