【发布时间】:2011-10-06 17:25:49
【问题描述】:
我需要一个在 android 中使用 GZip 压缩字符串的示例。我想向方法发送一个像“hello”这样的字符串并得到以下压缩字符串:
BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVWl
那我需要解压。谁能给我一个例子并完成以下方法?
private String compressString(String input) {
//...
}
private String decompressString(String input) {
//...
}
谢谢,
更新
根据scessor's answer,现在我有以下4种方法。 Android 和 .net 压缩和解压缩方法。除一种情况外,这些方法彼此兼容。我的意思是它们在前 3 个状态是兼容的,但在第 4 个状态是不兼容的:
- 状态 1) Android.compress Android.decompress: (OK)
- 状态 2) Net.compress Net.decompress: (OK)
- 状态 3) Net.compress -> Android.decompress: (OK)
- 状态 4) Android.compress -> .Net.decompress: (不行)
有人能解决吗?
Android 方法:
public static String compress(String str) throws IOException {
byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
gos.close();
os.close();
byte[] compressed = new byte[4 + os.toByteArray().length];
System.arraycopy(blockcopy, 0, compressed, 0, 4);
System.arraycopy(os.toByteArray(), 0, compressed, 4,
os.toByteArray().length);
return Base64.encode(compressed);
}
public static String decompress(String zipText) throws IOException {
byte[] compressed = Base64.decode(zipText);
if (compressed.length > 4)
{
GZIPInputStream gzipInputStream = new GZIPInputStream(
new ByteArrayInputStream(compressed, 4,
compressed.length - 4));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int value = 0; value != -1;) {
value = gzipInputStream.read();
if (value != -1) {
baos.write(value);
}
}
gzipInputStream.close();
baos.close();
String sReturn = new String(baos.toByteArray(), "UTF-8");
return sReturn;
}
else
{
return "";
}
}
.Net 方法:
public static string compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}
public static string decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
【问题讨论】:
-
compressString的结果不能是String,它必须是bytes[]。同样,decompressString的输入不能是String,也必须是bytes[]。 -
“反之亦然”是什么意思?使用
String压缩GZIPOutputStream? ;-) -
我的 .Net 方法创建的大字符串与 Android 中 compress 方法的结果不同。我更新了我的问题并插入了 .Net Compress 和 Decompress 方法。任何人都可以更改这些方法来创建相同的压缩字符串吗?
-
有许多可能的、有效的“压缩”字符串将解压缩为字符串“Hello”。如果两个不同的压缩器产生不同的输出,那没关系,只要它们在所有输出上都正确解压缩。对于 NOT OK 情况,您从解压器得到什么输出?
-
当我将 android 压缩结果提供给 .Net 解压缩方法时,出现异常
标签: android .net compression zip gzip