我需要的COM pressing在Android中使用gzip字符串的例子。我想送一个字符串,如你好的方法,并得到以下压缩字符串:
BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA==
然后,我需要DECOM preSS它。任何人都可以给我一个例子,并完成以下的方法?
私有String COM pressString(字符串输入){
// ...
}
私人字符串DECOM pressString(字符串输入){
// ...
}
谢谢
更新
根据 scessor的回答,现在我有以下4种方法。 Android和.NET COM preSS和DECOM preSS方法。这些方法是彼此相容除了一种情况。我的意思是他们是在第四状态中的前3个国家兼容,但不兼容的:
在状态1)Android.com preSS< - > Android.decom preSS:(确定) 在状态2)Net.com preSS< - > Net.decom preSS:(确定) 在状态3)Net.com preSS - > Android.decom preSS:(确定) 在状态4)Android.com preSS - > .Net.decom preSS:(不会确定)有谁能够解决呢?
Android的方法:
公共静态字符串COM preSS(字符串str)抛出IOException异常{
byte []的blockcopy =的ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(str.length())
.array();
ByteArrayOutputStream OS =新ByteArrayOutputStream(str.length());
GZIPOutputStream GOS =新GZIPOutputStream(OS);
gos.write(str.getBytes());
gos.close();
os.close();
byte []的COM pressed =新的字节[4 + os.toByteArray()长]
System.arraycopy(blockcopy,0,玉米pressed,0,4);
System.arraycopy(os.toByteArray(),0,COM pressed,4,
os.toByteArray()的长度)。
返回Base64.en code(COM pressed);
}
公共静态字符串DECOM preSS(字符串zipText)抛出IOException异常{
byte []的COM pressed = Base64.de code(zipText);
如果(COM pressed.length→4)
{
GZIPInputStream gzipInputStream =新GZIPInputStream(
新ByteArrayInputStream的(COM pressed,4,
COM pressed.length - 4));
ByteArrayOutputStream BAOS =新ByteArrayOutputStream();
对于(int值= 0;值= -1;!){
值= gzipInputStream.read();
如果(值!= - 1){
baos.write(值);
}
}
gzipInputStream.close();
baos.close();
字符串sReturn =新的String(baos.toByteArray(),UTF-8);
返回sReturn;
}
其他
{
返回 ;
}
}
.NET方法:
公共静态字符串COM preSS(文本字符串)
{
byte []的缓冲区= Encoding.UTF8.GetBytes(文本);
MemoryStream的毫秒=新的MemoryStream();
使用(GZipStream邮编=新GZipStream(MS,COM pressionMode.Com preSS,真))
{
zip.Write(缓冲液,0,buffer.Length);
}
ms.Position = 0;
MemoryStream的outStream =新的MemoryStream();
byte []的COM pressed =新的字节[ms.Length]
ms.Read(COM pressed,0,COM pressed.Length);
byte []的gzBuffer =新的字节[COM pressed.Length + 4];
System.Buffer.BlockCopy(COM pressed,0,gzBuffer,4,COM pressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length),0,gzBuffer,0,4);
返回Convert.ToBase64String(gzBuffer);
}
公共静态字符串DECOM preSS(字符串COM pressedText)
{
byte []的gzBuffer = Convert.FromBase64String(COM pressedText);
使用(MemoryStream的毫秒=新的MemoryStream())
{
INT msgLength = BitConverter.ToInt32(gzBuffer,0);
ms.Write(gzBuffer,4,gzBuffer.Length - 4);
byte []的缓冲区=新的字节[msgLength]
ms.Position = 0;
使用(GZipStream邮编=新GZipStream(MS,COM pressionMode.Decom preSS))
{
zip.Read(缓冲液,0,buffer.Length);
}
返回Encoding.UTF8.GetString(缓冲液);
}
}
解决方案
gzip的方法:
公共静态byte []的COM preSS(字符串字符串)抛出IOException异常{
ByteArrayOutputStream OS =新ByteArrayOutputStream(string.length减());
GZIPOutputStream GOS =新GZIPOutputStream(OS);
gos.write(string.getBytes());
gos.close();
byte []的COM pressed = os.toByteArray();
os.close();
返回COM pressed;
}
公共静态字符串DECOM preSS(byte []的COM pressed)抛出IOException异常{
最终诠释BUFFER_SIZE = 32;
ByteArrayInputStream的是=新ByteArrayInputStream的(COM pressed);
GZIPInputStream GIS =新GZIPInputStream(是,BUFFER_SIZE);
StringBuilder的字符串=新的StringBuilder();
byte []的数据=新的字节[BUFFER_SIZE];
INT读取动作;
而((读取动作= gis.read(数据))!= - 1){
string.append(新的字符串(data,0,读取动作));
}
gis.close();
is.close();
返回string.toString();
}
和测试:
最后文本字符串=你好;
尝试 {
byte []的COM pressed = com的preSS(文本);
对于(字节字符:COM pressed){
Log.d(测试,将String.valueOf(字));
}
字符串DECOM pressed = DECOM preSS(COM pressed);
Log.d(测试,DECOM pressed);
}赶上(IOException异常E){
e.printStackTrace();
}
===更新===
如果你需要的.Net compability我的code已被一点点改变:
公共静态byte []的COM preSS(字符串字符串)抛出IOException异常{
byte []的blockcopy =的ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(string.length减())
.array();
ByteArrayOutputStream OS =新ByteArrayOutputStream(string.length减());
GZIPOutputStream GOS =新GZIPOutputStream(OS);
gos.write(string.getBytes());
gos.close();
os.close();
byte []的COM pressed =新的字节[4 + os.toByteArray()长]
System.arraycopy(blockcopy,0,玉米pressed,0,4);
System.arraycopy(os.toByteArray(),0,COM pressed,4,os.toByteArray()的长度。);
返回COM pressed;
}
公共静态字符串DECOM preSS(byte []的COM pressed)抛出IOException异常{
最终诠释BUFFER_SIZE = 32;
ByteArrayInputStream的是=新ByteArrayInputStream的(COM pressed,4,COM pressed.length - 4);
GZIPInputStream GIS =新GZIPInputStream(是,BUFFER_SIZE);
StringBuilder的字符串=新的StringBuilder();
byte []的数据=新的字节[BUFFER_SIZE];
INT读取动作;
而((读取动作= gis.read(数据))!= - 1){
string.append(新的字符串(data,0,读取动作));
}
gis.close();
is.close();
返回string.toString();
}
您可以使用相同的测试脚本。
I need an example for compressing a string using GZip in android. I want to send a string like "hello" to the method and get the following zipped string:
BQAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyLmeVlW/w+GphA2BQAAAA==
Then I need to decompress it. Can anybody give me an example and complete the following methods?
private String compressString(String input) {
//...
}
private String decompressString(String input) {
//...
}
Thanks,
update
According to scessor's answer, Now I have the following 4 methods. Android and .net compress and decompress methods. These methods are compatible with each other except in one case. I mean they are compatible in the first 3 states but incompatible in the 4th state:
state 1) Android.compress <-> Android.decompress: (OK) state 2) Net.compress <-> Net.decompress: (OK) state 3) Net.compress -> Android.decompress: (OK) state 4) Android.compress -> .Net.decompress: (NOT OK)can anybody solve it?
Android methods:
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 methods:
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);
}
}
解决方案
The GZIP methods:
public static byte[] compress(String string) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(string.getBytes());
gos.close();
byte[] compressed = os.toByteArray();
os.close();
return compressed;
}
public static String decompress(byte[] compressed) throws IOException {
final int BUFFER_SIZE = 32;
ByteArrayInputStream is = new ByteArrayInputStream(compressed);
GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
StringBuilder string = new StringBuilder();
byte[] data = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = gis.read(data)) != -1) {
string.append(new String(data, 0, bytesRead));
}
gis.close();
is.close();
return string.toString();
}
And a test:
final String text = "hello";
try {
byte[] compressed = compress(text);
for (byte character : compressed) {
Log.d("test", String.valueOf(character));
}
String decompressed = decompress(compressed);
Log.d("test", decompressed);
} catch (IOException e) {
e.printStackTrace();
}
=== Update ===
If you need .Net compability my code has to be changed a little:
public static byte[] compress(String string) throws IOException {
byte[] blockcopy = ByteBuffer
.allocate(4)
.order(java.nio.ByteOrder.LITTLE_ENDIAN)
.putInt(string.length())
.array();
ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(string.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 compressed;
}
public static String decompress(byte[] compressed) throws IOException {
final int BUFFER_SIZE = 32;
ByteArrayInputStream is = new ByteArrayInputStream(compressed, 4, compressed.length - 4);
GZIPInputStream gis = new GZIPInputStream(is, BUFFER_SIZE);
StringBuilder string = new StringBuilder();
byte[] data = new byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = gis.read(data)) != -1) {
string.append(new String(data, 0, bytesRead));
}
gis.close();
is.close();
return string.toString();
}
You can use the same test script.