问题描述
我在.NET新手。我做在C#中的COM pression和DECOM pression字符串。还有一个XML和我在字符串转换后,我做的COM pression和DECOM pression.There在我的code无编译错误,除非我DECOM pression我的code,并返回我的字符串,其只返回XML的一半。
I am newbie in .net. I am doing compression and decompression string in C#. There is a XML and I am converting in string and after that I am doing compression and decompression.There is no compilation error in my code except when I decompression my code and return my string, its returning only half of the XML.
下面是我的code,请纠正我,我错了。
Below is my code, please correct me where I am wrong.
code:
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);
}
}
我的XML的大小是63KB。
My XML size is 63KB.
推荐答案
在code到COM preSS / DECOM preSS字符串
The code to compress/decompress a string
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);
}
记住邮编
返回字节[]
,而解压
返回字符串
。如果你想从邮编
您可以使用Base64 EN code时(例如 Convert.ToBase64String(R1)$ C字符串$ C>)(
邮编
的结果非常二进制!这是不是你可以打印到屏幕上,或直接在XML编写)
Remember that Zip
returns a byte[]
, while Unzip
returns a string
. If you want a string from Zip
you can Base64 encode it (for example by using Convert.ToBase64String(r1)
) (the result of Zip
is VERY binary! It isn't something you can print to the screen or write directly in an XML)
建议的版本是NET 2.0,为.NET 4.0中使用 MemoryStream.CopyTo
。
The version suggested is for .NET 2.0, for .NET 4.0 use the MemoryStream.CopyTo
.
重要:的COM pressed内容不能被写入到输出流,直到 GZipStream
知道它所有的输入(即,为了有效地玉米preSS它需要的所有数据)。你需要确保你的Dispose()
的 GZipStream
检查输出流(前如<$ C的$ C> mso.ToArray())。这与进行使用(){}
块以上。请注意, GZipStream
是最里面的块和内容是它的外部访问。这同样适用于DECOM pressing:的Dispose()
的 GZipStream
试图访问数据之前
IMPORTANT: The compressed contents cannot be written to the output stream until the GZipStream
knows that it has all of the input (i.e., to effectively compress it needs all of the data). You need to make sure that you Dispose()
of the GZipStream
before inspecting the output stream (e.g., mso.ToArray()
). This is done with the using() { }
block above. Note that the GZipStream
is the innermost block and the contents are accessed outside of it. The same goes for decompressing: Dispose()
of the GZipStream
before attempting to access the data.
这篇关于COM pression / DECOM pression串用C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!