Usuário com melhor resposta
Descompactar String - Erro "outofmemoryexception"

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.
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
- Editado André de Mattos Ferraz sexta-feira, 6 de maio de 2016 19:58
- Sugerido como Resposta André de Mattos Ferraz sexta-feira, 6 de maio de 2016 19:59
- Marcado como Resposta Yannick Freitas sexta-feira, 6 de maio de 2016 19:59
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.
-
-
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); } }
-
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. -
Amigo, qual a string que você está tentando passar? Como está seu método de compress?
- Editado Lailson Conceição sexta-feira, 6 de maio de 2016 14:45 Informação adicional
-
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.
- Editado Yannick Freitas sexta-feira, 6 de maio de 2016 16:49
-
-
-
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
-
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
-
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.
-
-
-
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
- Editado André de Mattos Ferraz sexta-feira, 6 de maio de 2016 19:58
- Sugerido como Resposta André de Mattos Ferraz sexta-feira, 6 de maio de 2016 19:59
- Marcado como Resposta Yannick Freitas sexta-feira, 6 de maio de 2016 19:59
-