如何使用与.Net兼容的GZIPOutputStream压缩和解压字符串?

我需要一个在android中使用GZip压缩字符串的示例。我想向该方法发送一个类似“hello”的字符串,并获取以下压缩字符串:

BQAAB+LCAAAAAABADTVQDGHEMWJSYVBCP7F0R1StfgdkeiggatJNIQBDSWYJN5PLSHWLHIYMRKOHKZVZLXWYWQMZTNBZ33NVVFFEE++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/FNWPYLMEVLW/w+GPHA2BQAAA==

然后我需要解压。谁能给我举个例子并完成以下方法

私有字符串压缩字符串(字符串输入){
//...
}
私有字符串解压缩字符串(字符串输入){
//...
}

谢谢


更新

根据scessor的回答,现在我有以下4种方法。Android和.net压缩和解压缩方法。除一种情况外,这些方法彼此兼容。我的意思是,它们在前3个州兼容,但在第4个州不兼容:

  • 状态1)Android.compress<->Android.decompress:(确定
  • 状态2)Net.compress<->Net.decompress:(正常
  • 状态3)Net.compress->Android.decompress:(OK
  • 状态4)Android.compress->.Net.decompress:(不正常

有人能解决吗

Android方法:

公共静态字符串压缩(String str)引发IOException{
字节[]块复制=字节缓冲
.分配(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream os=新建ByteArrayOutputStream(str.length());
GZIPOutputStream gos=新的GZIPOutputStream(os);
写入(str.getBytes());
gos.close();
os.close();
字节[]压缩=新字节[4+os.toByteArray().length];
System.arraycopy(块拷贝,0,压缩,0,4);
System.arraycopy(os.toByteArray(),0,压缩,4,
os.toByteArray().length);
返回Base64.encode(压缩);
}
公共静态字符串解压缩(String zipText)引发IOException{
字节[]压缩=Base64.decode(zipText);
如果(压缩长度>4)
{
gzip输入流gzip输入流=新的gzip输入流(
新的ByteArrayInputStream(压缩,4,
压缩(长度-4);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
对于(int值=0;值!=-1;){
value=gzipInputStream.read();
如果(值!=-1){
写(值);
}
}
gzipInputStream.close();
baos.close();
String sReturn=新字符串(baos.toByteArray(),“UTF-8”);
回报率;
}
其他的
{
返回“”;
}
}

.Net方法:

公共静态字符串压缩(字符串文本)
{
byte[]buffer=Encoding.UTF8.GetBytes(文本);
MemoryStream ms=新的MemoryStream();
使用(GZipStream zip=newgzipstream(ms,CompressionMode.Compress,true))
{
写入(buffer,0,buffer.Length);
}
ms.Position=0;
MemoryStream outStream=新的MemoryStream();
字节[]压缩=新字节[ms.Length];
ms.Read(压缩,0,压缩长度);
字节[]gzBuffer=新字节[compressed.Length+4];
System.Buffer.BlockCopy(压缩的,0,gzBuffer,4,压缩的.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(Buffer.Length),0,gzBuffer,0,4);
返回Convert.ToBase64String(gzBuffer);
}
公共静态字符串解压缩(字符串压缩文本)
{
字节[]gzBuffer=Convert.FromBase64String(compressedText);
使用(MemoryStream ms=new MemoryStream())
{
int-msgLength=BitConverter.ToInt32(gzBuffer,0);
ms.Write(gzBuffer,4,gzBuffer.Length-4);
字节[]缓冲区=新字节[msgLength];
ms.Position=0;
使用(GZipStream zip=newgzipstream(ms,CompressionMode.Decompress))
{
读取(buffer,0,buffer.Length);
}
返回Encoding.UTF8.GetString(缓冲区);
}
}

GZIP方法:

公共静态字节[]压缩(字符串)引发IOException{
ByteArrayOutputStream os=新建ByteArrayOutputStream(string.length());
GZIPOutputStream gos=新的GZIPOutputStream(os);
write(string.getBytes());
gos.close();
byte[]compressed=os.toByteArray();
os.close();
返回压缩;
}
公共静态字符串解压缩(字节[]压缩)引发IOException{
最终整数缓冲区大小=32;
ByteArrayInputStream是=新的ByteArrayInputStream(压缩);
GZIPInputStream gis=新的GZIPInputStream(即缓冲区大小);
StringBuilder字符串=新的StringBuilder();
字节[]数据=新字节[缓冲区大小];
int字节读取;
而((bytesRead=gis.read(data))!=-1){
append(新字符串(数据,0,字节读取));
}
gis.close();
is.close();
返回字符串.toString();
}

还有一个测试:

最终字符串text=“hello”;
试一试{
字节[]压缩=压缩(文本);
for(字节字符:压缩){
Log.d(“test”,String.valueOf(character));
}
字符串解压缩=解压缩(压缩);
Log.d(“测试”,解压缩);
}捕获(IOE异常){
e、 printStackTrace();
}

==更新===

如果您需要.Net兼容性,我的代码必须稍作更改:

公共静态字节[]压缩(字符串)引发IOException{
字节[]块复制=字节缓冲
.分配(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(string.length())
.array();
ByteArrayOutputStream os=新建ByteArrayOutputStream(string.length());
GZIPOutputStream gos=新的GZIPOutputStream(os);
write(string.getBytes());
gos.close();
os.close();
字节[]压缩=新字节[4+os.toByteArray().length];
System.arraycopy(块拷贝,0,压缩,0,4);
System.arraycopy(os.toByteArray(),0,压缩,4,os.toByteArray().length);
返回压缩;
}
公共静态字符串解压缩(字节[]压缩)引发IOException{
最终整数缓冲区大小=32;
ByteArrayInputStream is=新的ByteArrayInputStream(compressed,4,compressed.length-4);
GZIPInputStream gis=新的GZIPInputStream(即缓冲区大小);
StringBuilder字符串=新的StringBuilder();
字节[]数据=新字节[缓冲区大小];
int字节读取;
而((bytesRead=gis.read(data))!=-1){
append(新字符串(数据,0,字节读取));
}
gis.close();
is.close();
返回字符串.toString();
}

您可以使用相同的测试脚本

发表评论