none
Descompactar String - Erro "outofmemoryexception" RRS feed

  • Pergunta

  • Olá Pessoal,

    Estou tentando descompactar uma string utilizando o seguinte método

           public static string DecompressString(string compressedText)
            {
                var ascii = new ASCIIEncoding();
                byte[] gzBuffer = ascii.GetBytes(compressedText);
    
                Int32.MaxValue.ToString();
                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);
                }
            }
    A String que estou descompactando é essa: 1f8b0800000000000000b555cb8eda3014dd8f34ff70c59ec481041226443289cb584ae2d4f6207599320c8d9ac208d84c77a3aedb5dbf09a99fd0afa931420c104f5ba9f522927deeb93ebeaf84b7324ba370c49277d1f55528f1282530623c217cd8422d98ceeafab1bcbfaf16f36147efd68fe574bf5b6f9eead9b0f5b05c6cda0fe5a7aa7e1ae05555d637fa645d7d9e0d829be9b25eae06efeb72fab1a56fe051289328c11283e3b591db767aa1ad4ed48747a0d6d1886605a719014ec45d2a71c220c130c1294df0f60b8398e492e3f4940da72e32cc630c0841ccf2184846a522117510385dd47f959a52a1342604044b694c25de7e2762b71f638e734931a4f4ed9dd2926001eddd0542317e7c8b296ef0fbd273fef32be10c483ea10c02afdb071d8e82b398088133259181e3dac8b53be83c3c7b4fb6ced4ff48996f48199475355f0ca7b3c566b63a3c418cf7e22e600b9825ac6670970a4b25b550714c18c7cd56d94418e8b75808da8ce9381a450d20b7de184469a6195655c7b8f2bc2f86df191506054448c673665040d25d1190edf36b78c61a8bebdf2f43e291ea9b6ebf59a1dff3bd2e3463271d770e3a81e7781d6462f63a9eeb7b06d4b50f1d72e1b51f04a60b75735d1057d5fcc326f27cdf0afc46e8109c3f300140163a7fd25f981ca15daa8fd988592a0a9c0fdd483289533da0c6eefae5301a80d35424276363a47dda7af087b6fe0b5c5ffd0233d6be2b0e060000

    Está apresentando o Erro OutOfMemoryException.

    Podem me ajudar?

    Desde já, obrigado.

    sexta-feira, 6 de maio de 2016 12:06

Respostas

  • Eu mudei seu método aqui pra isso, ele parou de dar erro, mas não sei se o retorno ta certo:

    <HTML><BODY>
    <TABLE BORDER="0" cellpadding=2 cellspacing=2 style="font-family:Arial;font-size:9;color:black">
    <TR><TD>DATA 15-04-16</TD></TR>    
    <TR><TD>IMPRIME RESULTADO DA VALIDAǃO CENTRAL</TD></TR>         
    <TR><TD>MARCA 00 CONC EMITENTE 0091307</TD></TR>         
    <TR><TD>LISTA DE SOLICITAǕES DE GARANTIA LIQUIDADAS - CONSISTʎCIA</TD></TR>           
    <TR><TD>NڍERO ENVIO 9537 DATA PROCESSAMENTO 14/04/2016</TD></TR>       
    </TABLE>
    <TABLE BORDER="0" cellpadding=2 cellspacing=2 style="font-family:Arial;font-size:8;color:black">
    <TR><TD align=center>NڍERO SG</TD><TD align=center>N. O.S.</TD><TD align=center>CONC. REPARADORA</TD><TD align=center>MVS</TD><TD align=center>CHASSI</TD><TD align=center>DATA SG</TD><TD align=center>N: N.F.</TD><TD align=center>DATA N.F.</TD><TD align=center>VALOR SG SOLIC.</TD><TD align=center>VALOR SG PG</TD><TD align=center>ESTORNO</TD><TD align=center>DELTA PEǁ</TD><TD align=center>DELTA MO</TD></TR>                                                                                             
    <TR><TD align=center>013037</TD><TD align=center>86853 </TD><TD align=center>0091307</TD><TD align=center>1951520</TD><TD align=center>00625485</TD><TD align=center>04/16</TD><TD align=center>17997</TD><TD align=center>14/04/16</TD><TD align=right>588.98</TD><TD align=right>        588.98</TD><TD align=right>          0.00</TD><TD align=right>          0.00</TD><TD align=right>  0.00</TD></TR>
    <TR><TD COLSPAN=4>TOTAL DE SG4s LIQUIDADAS : 1</TD></TR>          
    </TABLE>
    <BR>
    </BODY></HTML>

    O código ficou assim:

    public static string DecompressString(string compressedText)
            {
                byte[] gZipBuffer = ConvertHexStringToByteArray(compressedText);
    
                //byte[] gZipBuffer = new byte[compressedText.Length * sizeof(char)];
                //System.Buffer.BlockCopy(compressedText.ToCharArray(), 0, gZipBuffer, 0, gZipBuffer.Length);
                
                using (var memoryStream = new MemoryStream())
                {
                    int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
                    memoryStream.Write(gZipBuffer, 0, gZipBuffer.Length);
    
                    var buffer = new byte[dataLength];
    
                    memoryStream.Position = 0;
                    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
                    {
                        gZipStream.Read(buffer, 0, buffer.Length);
                    }
    
                    return Encoding.UTF8.GetString(buffer);
                }
            }
    
            public static byte[] ConvertHexStringToByteArray(string hexString)
            {
                if (hexString.Length % 2 != 0)
                {
                    throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
                }
    
                byte[] HexAsBytes = new byte[hexString.Length / 2];
                for (int index = 0; index < HexAsBytes.Length; index++)
                {
                    string byteValue = hexString.Substring(index * 2, 2);
                    HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
                }
    
                return HexAsBytes;
            }

    Existiam dois problemas, vc tava usando ascii normal... Sua string eh hexascii... entao tive que converter ela com o método:

    ConvertHexStringToByteArray

    E outro era nessa linha:

    memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length-4)

    Isso dava erro de magic number... Que são o dois primeiros bytes que definem o tipo do arquivo... Como vc tava copiando, a partir da posicao 4, dava erro de magic number... EU mudei pra copiar a partir do 0.


    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985


    sexta-feira, 6 de maio de 2016 19:55

Todas as Respostas

  • Bom dia Yannick Freitas,

    Poderia compartilhar todos os detalhes apresentados pelo erro?

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 6 de maio de 2016 13:28
  • sexta-feira, 6 de maio de 2016 13:33
  • Bom dia Yannick, tente deste modo:

    public static string DescompressString(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);
                }
    }
    

    sexta-feira, 6 de maio de 2016 14:04
  • Olá Lailson,

    Apresentou o seguinte erro logo na primeira linha: 

    An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

    Additional information: Comprimento inválido para uma matriz ou uma cadeia de caracteres de Base 64.

    sexta-feira, 6 de maio de 2016 14:07
  • Amigo, qual a string que você está tentando passar? Como está seu método de compress?


    sexta-feira, 6 de maio de 2016 14:37
  • Lailson,

    Eu recebo essa string de um retorno de um webservice.

    1f8b0800000000000000b555cb8eda3014dd8f34ff70c59ec481041226443289cb584ae2d4f6207599320c8d9ac208d84c77a3aedb5dbf09a99fd0afa931420c104f5ba9f522927deeb93ebeaf84b7324ba370c49277d1f55528f1282530623c217cd8422d98ceeafab1bcbfaf16f36147efd68fe574bf5b6f9eead9b0f5b05c6cda0fe5a7aa7e1ae05555d637fa645d7d9e0d829be9b25eae06efeb72fab1a56fe051289328c11283e3b591db767aa1ad4ed48747a0d6d1886605a719014ec45d2a71c220c130c1294df0f60b8398e492e3f4940da72e32cc630c0841ccf2184846a522117510385dd47f959a52a1342604044b694c25de7e2762b71f638e734931a4f4ed9dd2926001eddd0542317e7c8b296ef0fbd273fef32be10c483ea10c02afdb071d8e82b398088133259181e3dac8b53be83c3c7b4fb6ced4ff48996f48199475355f0ca7b3c566b63a3c418cf7e22e600b9825ac6670970a4b25b550714c18c7cd56d94418e8b75808da8ce9381a450d20b7de184469a6195655c7b8f2bc2f86df191506054448c673665040d25d1190edf36b78c61a8bebdf2f43e291ea9b6ebf59a1dff3bd2e3463271d770e3a81e7781d6462f63a9eeb7b06d4b50f1d72e1b51f04a60b75735d1057d5fcc326f27cdf0afc46e8109c3f300140163a7fd25f981ca15daa8fd988592a0a9c0fdd483289533da0c6eefae5301a80d35424276363a47dda7af087b6fe0b5c5ffd0233d6be2b0e060000

    E devo descompacta-lá, agora não sei se antes devo convertê-lá para depois descompactar.


    sexta-feira, 6 de maio de 2016 16:07
  • Qual o método de compress?


    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    sexta-feira, 6 de maio de 2016 18:40
  • gzip
    sexta-feira, 6 de maio de 2016 18:42
  • Entaã vc ta enviando uma string comprimida via gzip pro método? 

    public static void CopyTo(Stream src, Stream dest) {
        byte[] bytes = new byte[4096];
    
        int cnt;
    
        while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) {
            dest.Write(bytes, 0, cnt);
        }
    }
    
    public static byte[] Zip(string str) {
        var bytes = Encoding.UTF8.GetBytes(str);
    
        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream()) {
            using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
                //msi.CopyTo(gs);
                CopyTo(msi, gs);
            }
    
            return mso.ToArray();
        }
    }
    
    public static string Unzip(byte[] bytes) {
        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream()) {
            using (var gs = new GZipStream(msi, CompressionMode.Decompress)) {
                //gs.CopyTo(mso);
                CopyTo(gs, mso);
            }
    
            return Encoding.UTF8.GetString(mso.ToArray());
        }
    }
    
    static void Main(string[] args) {
        byte[] r1 = Zip("StringStringStringStringStringStringStringStringStringStringStringStringStringString");
        string r2 = Unzip(r1);
    }
    referência: http://stackoverflow.com/a/7343623/4471341


    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    sexta-feira, 6 de maio de 2016 18:48
  • Outro detalhe, essa string está vindo da web? Via post? Get? Pode ser que ao ser enviada pelo navegador ela esteja sofrendo algum encode e alterando algum símbolo. Assim, quando cai no seu método ocasiona o erro.

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    sexta-feira, 6 de maio de 2016 18:55
  • Então André,

    É um XML de resposta, segue abaixo:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    	<SOAP-ENV:Body>
    		<ns1:dduGetResponse xmlns:ns1="urn:ddu">
    			<Ticket xsi:type="xsd:string">M3L%5E%3A3%2C%21%2AIN%2F%3FNT%5EHV%2A%24U%5CB%26%2B2F1K-4Q%5D%21CD7%5DO%22%2AAXP%3D-%21C%3DX%3A70T%3BB%5D02QWMYA%23BI%3B%5D%5D%21L6%40NW%5D%3BRVK%5EZ%28M%28AQ%29AO3%3FM6S%2A%259%23QI_83%3FZ%3AJ9G%2A%2A%3B%5DB8J%5E2K%3DM%27%27Y%294%40%60%220J%29%22%238Y38-%29Z%3D%2C%26%3CN1%21HTB5T%3B-%5B%5B%220NRQ%3EZCIQ%2BOY%5E%26HSKLNWB%5B%5DI%3DS2B.%5DGS%5CN%40FH%22N3R5%3F%5D%5E%2BU%22J2J%3CLC6%2CDTIW%3FEVEY%23%2BG5%5E%5BER%3EEQ_4%3C%60%60%0A</Ticket>
    			<Buffer xsi:type="xsd:string">1f8b0800000000000000c596db6edb300c86effd14bace9056a4ce978aada45a1d2b939d6cebfb3fc8281fd20c75071468562270648b227fc9fa4c3910dcb0bfad07e0978603fdd10ff77e38e7c7da7735bb845883a6a782736ea5a22bfb875137c7e25a8c9c01716cd6a5f329f826e4ca81016e9411640a0c4a33461760957662b3d994c4a1f5c7d00d69b3f957ba0fda28052a3e0b30161c09500a4dd12a10d1580148b3d51eb8455ba44af9027bb76ba6e6611eb71aba44a708d6a2d11a956da492c248949acb572fac60f2153465e1dc7483566ae46609e31c0ab1e2c685b3c82d7fd704705fdee266d6b0b9e99b05880af7d10f8f27dfc6c4f63107f6d3ff66f030bf5aaed8c9f7bd3f849853ff89ebbfac80ac68574856c736764d49b1659c3d1fa97bef778cd65f2feec7d46c6fef3f4980aaf0af8775cadb4bc8c7d03e25e6db53ecc2e7655c13a02bcce1b21d82cfecbbaf7f9c7d6e98ff155a5a94eec5df2df95580a9443ad531753e96e5777b15d41b478bdb530e4dec4fa98fb54fb42db267d937b46d8a4975d83ec78111ad6197fd40e118bec9b72ec0160c2ddf71232540c15028816ec45070ad660c8949c9411172f2cc0b8653f3308f5b0d5d68926ec459138cbae14a83b4233470a5c02d184a12a3c5cc9728774e2d610c21b9e6c6a5052e165adfc110670c8b86b718029f31ec075a51cf7ea6fc1cbbc3cd5cf0be18027c3186802b18d23eeaeac476747d8afdfd4818058805c33a36891dfd7197ee96705580ac84c9f80622f1df0428c2b06c7723ada1f24e1872b04e4f18829c31dcd3a180f63e797a779caae1d83ccce3d6428f5f196e84d56894a6eab62e405f3144c24b2e18920ec9afb0012a29577b48fa324652617e2512a87e3afaa2183f51384ad8cc15f81643336378ee12a30f5d1e0a84f0709dd3bdab21d8afc6d0bd8fe1b36ffd93cff1f332ae08407e530d7dfeedbf8587fe94e94842d567b83391a300a8848c1386e192daf31a848adb6d1fba3e65d60416fac18fe5733ca58e0ee67899404edd9053fb210148a762a2ae542ccd2d6128042a2c188276b4c3ef7d2a4651b9afb490f6d51fd287fce9990c0000</Buffer>
    			<Length xsi:type="xsd:string">1582</Length>
    			<Return xsi:type="xsd:string">0</Return>
    		</ns1:dduGetResponse>
    	</SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    o Encoding diz que é asciihex e compress gzip.


    sexta-feira, 6 de maio de 2016 18:59
  • VocÊ sabe qual o resultado dessa string?

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    sexta-feira, 6 de maio de 2016 19:49
  • Exatamente não.
    sexta-feira, 6 de maio de 2016 19:51
  • Eu mudei seu método aqui pra isso, ele parou de dar erro, mas não sei se o retorno ta certo:

    <HTML><BODY>
    <TABLE BORDER="0" cellpadding=2 cellspacing=2 style="font-family:Arial;font-size:9;color:black">
    <TR><TD>DATA 15-04-16</TD></TR>    
    <TR><TD>IMPRIME RESULTADO DA VALIDAǃO CENTRAL</TD></TR>         
    <TR><TD>MARCA 00 CONC EMITENTE 0091307</TD></TR>         
    <TR><TD>LISTA DE SOLICITAǕES DE GARANTIA LIQUIDADAS - CONSISTʎCIA</TD></TR>           
    <TR><TD>NڍERO ENVIO 9537 DATA PROCESSAMENTO 14/04/2016</TD></TR>       
    </TABLE>
    <TABLE BORDER="0" cellpadding=2 cellspacing=2 style="font-family:Arial;font-size:8;color:black">
    <TR><TD align=center>NڍERO SG</TD><TD align=center>N. O.S.</TD><TD align=center>CONC. REPARADORA</TD><TD align=center>MVS</TD><TD align=center>CHASSI</TD><TD align=center>DATA SG</TD><TD align=center>N: N.F.</TD><TD align=center>DATA N.F.</TD><TD align=center>VALOR SG SOLIC.</TD><TD align=center>VALOR SG PG</TD><TD align=center>ESTORNO</TD><TD align=center>DELTA PEǁ</TD><TD align=center>DELTA MO</TD></TR>                                                                                             
    <TR><TD align=center>013037</TD><TD align=center>86853 </TD><TD align=center>0091307</TD><TD align=center>1951520</TD><TD align=center>00625485</TD><TD align=center>04/16</TD><TD align=center>17997</TD><TD align=center>14/04/16</TD><TD align=right>588.98</TD><TD align=right>        588.98</TD><TD align=right>          0.00</TD><TD align=right>          0.00</TD><TD align=right>  0.00</TD></TR>
    <TR><TD COLSPAN=4>TOTAL DE SG4s LIQUIDADAS : 1</TD></TR>          
    </TABLE>
    <BR>
    </BODY></HTML>

    O código ficou assim:

    public static string DecompressString(string compressedText)
            {
                byte[] gZipBuffer = ConvertHexStringToByteArray(compressedText);
    
                //byte[] gZipBuffer = new byte[compressedText.Length * sizeof(char)];
                //System.Buffer.BlockCopy(compressedText.ToCharArray(), 0, gZipBuffer, 0, gZipBuffer.Length);
                
                using (var memoryStream = new MemoryStream())
                {
                    int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
                    memoryStream.Write(gZipBuffer, 0, gZipBuffer.Length);
    
                    var buffer = new byte[dataLength];
    
                    memoryStream.Position = 0;
                    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
                    {
                        gZipStream.Read(buffer, 0, buffer.Length);
                    }
    
                    return Encoding.UTF8.GetString(buffer);
                }
            }
    
            public static byte[] ConvertHexStringToByteArray(string hexString)
            {
                if (hexString.Length % 2 != 0)
                {
                    throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
                }
    
                byte[] HexAsBytes = new byte[hexString.Length / 2];
                for (int index = 0; index < HexAsBytes.Length; index++)
                {
                    string byteValue = hexString.Substring(index * 2, 2);
                    HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
                }
    
                return HexAsBytes;
            }

    Existiam dois problemas, vc tava usando ascii normal... Sua string eh hexascii... entao tive que converter ela com o método:

    ConvertHexStringToByteArray

    E outro era nessa linha:

    memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length-4)

    Isso dava erro de magic number... Que são o dois primeiros bytes que definem o tipo do arquivo... Como vc tava copiando, a partir da posicao 4, dava erro de magic number... EU mudei pra copiar a partir do 0.


    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985


    sexta-feira, 6 de maio de 2016 19:55
  • Muito obrigado André! Foi muito de muita ajuda mesmo! 

    Ótimo final de semana! 

    sexta-feira, 6 de maio de 2016 20:00