Eu sou novato em .net. Estou fazendo a seqüência de compactação e descompactação em c #. Existe um XML e estou convertendo em string e, depois disso, estou fazendo compressão e descompressão. Não há erro de compilação no meu código, exceto quando descompacto meu código e retorno minha string, retornando apenas metade do XML.
Abaixo está o meu código, corrija-me onde estiver errado.
Código:
class Program
{
public static string Zip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for compress
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write(byteArray, 0, byteArray.Length);
//Close, DO NOT FLUSH cause bytes will go missing...
sw.Close();
//Transform byte[] zip data to string
byteArray = ms.ToArray();
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
foreach (byte item in byteArray)
{
sB.Append((char)item);
}
ms.Close();
sw.Dispose();
ms.Dispose();
return sB.ToString();
}
public static string UnZip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for decompress
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Decompress);
//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];
//Decompress
int rByte = sr.Read(byteArray, 0, byteArray.Length);
//Transform byte[] unzip data to string
System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
//Read the number of bytes GZipStream red and do not a for each bytes in
//resultByteArray;
for (int i = 0; i < rByte; i++)
{
sB.Append((char)byteArray[i]);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB.ToString();
}
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"D:\RSP.xml");
string val = doc.ToString(SaveOptions.DisableFormatting);
val = Zip(val);
val = UnZip(val);
}
}
Meu tamanho XML é 63 KB.
c#
string
.net-2.0
compression
Mohit Kumar
fonte
fonte
using
.Encoding
o caminho errado. Você precisa da base 64 aqui, de acordo com a resposta de xanatosRespostas:
O código para compactar / descompactar uma string
Lembre-se que
Zip
retorna abyte[]
, enquantoUnzip
retorna astring
. Se você quer uma string,Zip
pode codificá-la pelo Base64 (por exemplo, usandoConvert.ToBase64String(r1)
) (o resultadoZip
é MUITO binário! Não é algo que você possa imprimir na tela ou escrever diretamente em um XML)A versão sugerida é para o .NET 2.0, para o .NET 4.0 use o
MemoryStream.CopyTo
.IMPORTANTE: O conteúdo compactado não pode ser gravado no fluxo de saída até
GZipStream
que você saiba que possui toda a entrada (ou seja, para compactar efetivamente ele precisa de todos os dados). Você precisa ter certeza de que vocêDispose()
doGZipStream
antes de inspecionar o fluxo de saída (por exemplo,mso.ToArray()
). Isso é feito com ousing() { }
bloco acima. Observe que esteGZipStream
é o bloco mais interno e o conteúdo é acessado fora dele. O mesmo vale para descompactar:Dispose()
doGZipStream
antes de tentar acessar os dados.fonte
string s = "X\uD800Y"
. Notei que funciona se mudarmos a codificação para UTF7 ... mas com UTF7 temos certeza de que todos os caracteres podem ser representados?de acordo com este trecho, eu uso esse código e está funcionando bem:
fonte
Com o advento do .NET 4.0 (e superior) com os métodos Stream.CopyTo (), pensei em publicar uma abordagem atualizada.
Também acho que a versão abaixo é útil como um exemplo claro de uma classe independente para compactar cadeias regulares para cadeias codificadas em Base64 e vice-versa:
Aqui está outra abordagem usando a técnica de métodos de extensão para estender a classe String para adicionar compactação e descompactação de string. Você pode soltar a classe abaixo em um projeto existente e, em seguida, usar o seguinte:
e
A saber:
fonte
using
instruções para as instâncias do MemoryStream. E para os desenvolvedores F # lá fora: se abster de utilizar a palavra-chaveuse
para a instância compressorStream / decompressorStream, porque eles precisam ser eliminados manualmente antesToArray()
é chamadoEsta é uma versão atualizada do .NET 4.5 e mais recente usando async / waitit e IEnumerables:
Com isso, você pode serializar tudo o que
BinaryFormatter
suporta, em vez de apenas strings.Editar:
Caso você precise se cuidar
Encoding
, basta usar Convert.ToBase64String (byte []) ...Dê uma olhada nesta resposta se precisar de um exemplo!
fonte
Convert.ToBase64String(byte[])
. Por favor, consulte esta resposta ( stackoverflow.com/a/23908465/3286975 ). Espero que ajude!Para quem ainda está recebendo O número mágico no cabeçalho do GZip não está correto. Verifique se você está passando em um fluxo GZip. ERRO e se sua string foi compactada usando php, você precisará fazer algo como:
fonte