我怎么能压缩和解压缩使用GZIPOutputStream即与.net兼容的字符串?字符串、我怎么能、GZIPOutputStream、net

2023-09-02 20:41:47 作者:北城荒。

我需要的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;
    }
    其他
    {
        返回 ;
    }
}
 
win10怎么解压7z文件

.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.