Saya pemula di .net. Saya melakukan kompresi dan dekompresi string dalam C #. Ada XML dan saya mengkonversi dalam string dan setelah itu saya melakukan kompresi dan dekompresi. Tidak ada kesalahan kompilasi dalam kode saya kecuali ketika saya mendekompresi kode saya dan mengembalikan string saya, mengembalikan hanya setengah dari XML.
Di bawah ini adalah kode saya, tolong perbaiki saya di mana saya salah.
Kode:
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);
}
}
Ukuran XML saya adalah 63KB.
c#
string
.net-2.0
compression
Mohit Kumar
sumber
sumber
using
.Encoding
jalan yang salah. Anda memerlukan base-64 di sini, sesuai jawaban xanatosJawaban:
Kode untuk mengompresi / mendekompresi string
Ingat bahwa
Zip
mengembalikan abyte[]
, sementaraUnzip
mengembalikan astring
. Jika Anda menginginkan sebuah string dariZip
Anda, Anda dapat menyalinnya dari Base64 (misalnya dengan menggunakanConvert.ToBase64String(r1)
) (hasilnyaZip
SANGAT biner! Ini bukan sesuatu yang dapat Anda cetak ke layar atau menulis langsung dalam XML)Versi yang disarankan adalah untuk .NET 2.0, untuk .NET 4.0 gunakan
MemoryStream.CopyTo
.PENTING: Konten terkompresi tidak dapat ditulis ke aliran output sampai
GZipStream
tahu bahwa ia memiliki semua input (yaitu, untuk secara efektif kompres perlu semua data). Anda perlu memastikan bahwa AndaDispose()
dariGZipStream
sebelum memeriksa aliran output (misalnya,mso.ToArray()
). Ini dilakukan denganusing() { }
blok di atas. Perhatikan bahwaGZipStream
ini adalah blok terdalam dan konten diakses di luarnya. Hal yang sama berlaku untuk dekompresi:Dispose()
dariGZipStream
sebelum mencoba untuk mengakses data.sumber
string s = "X\uD800Y"
. Saya perhatikan bahwa ini berfungsi jika kita mengubah Pengkodean ke UTF7 ... tetapi dengan UTF7 apakah kami yakin semua karakter dapat diwakili?menurut cuplikan ini saya menggunakan kode ini dan berfungsi dengan baik:
sumber
Dengan munculnya .NET 4.0 (dan lebih tinggi) dengan metode Stream.CopyTo (), saya pikir saya akan memposting pendekatan yang diperbarui.
Saya juga berpikir versi di bawah ini berguna sebagai contoh yang jelas dari kelas mandiri untuk memampatkan string biasa ke string yang disandikan Base64, dan sebaliknya:
Berikut ini pendekatan lain menggunakan teknik metode ekstensi untuk memperluas kelas String untuk menambahkan kompresi string dan dekompresi. Anda dapat menjatuhkan kelas di bawah ini ke proyek yang sudah ada dan kemudian menggunakannya:
dan
Yakni:
sumber
using
pernyataan untuk instance MemoryStream. Dan untuk para pengembang F # di luar sana: jangan menggunakan kata kunciuse
untuk instance compressorStream / decompressorStream, karena mereka harus dibuang secara manual sebelumToArray()
dipanggilIni adalah versi yang diperbarui untuk .NET 4.5 dan yang lebih baru menggunakan async / menunggu dan IEnumerables:
Dengan ini, Anda dapat membuat serialisasi semua
BinaryFormatter
dukungan, bukan hanya string.Edit:
Jika Anda perlu berhati-hati
Encoding
, Anda bisa menggunakan Convert.ToBase64String (byte []) ...Lihatlah jawaban ini jika Anda membutuhkan contoh!
sumber
Convert.ToBase64String(byte[])
. Silakan, lihat jawaban ini ( stackoverflow.com/a/23908465/3286975 ). Semoga ini bisa membantu!Bagi mereka yang masih mendapatkan Angka ajaib di header GZip tidak benar. Pastikan Anda melewati aliran GZip. GALAT dan jika string Anda di-zip menggunakan php, Anda harus melakukan sesuatu seperti:
sumber