① 今天發現c#在做字元串壓縮的時候的一個bug
NO,NO,事實上默認的Default是指你的操作系統當前所使用的編碼類型,在中國一般來說是UTF-8
如果你要指定的話可以用Encoding.UTF-8
但是解壓的時候也要用同一種編碼形式,否則就會出錯。。。
補充:剛剛收到你的信息了,你把字元串壓縮之後,卻又用Encoding.GetString方法來得到字元串,我想錯就錯在這一步,你應該直接把它(也就是所得到的位元組數組)以二進制的形式寫進文件文件的後綴你可以自定義一個也沒問題,然後讀取的時候再從文件中讀取出來。
簡單地說就是把兩個 CompressString2String,DecompressString2String兩個函數修改一下:
注釋:按鈕一為壓縮(把textBox1中的文本進行壓縮然後寫入date.dt文件)
按鈕一為壓縮(把date.dt文件的數據讀出來進行解壓縮並且顯示在textBox2中)
static void Compress(Stream source, Stream dest)
{
using (GZipStream zipStream = new GZipStream(dest, CompressionMode.Compress, true))
{
byte[] buf = new byte[1024];
int len;
while ((len = source.Read(buf, 0, buf.Length)) > 0)
zipStream.Write(buf, 0, len);
}
}
static void Decompress(Stream source, Stream dest)
{
using (GZipStream zipStream = new GZipStream(source, CompressionMode.Decompress, true))
{
byte[] buf = new byte[1024];
int len;
while ((len = zipStream.Read(buf, 0, buf.Length)) > 0)
dest.Write(buf, 0, len);
}
}
public static bool CompressString2String(string strSource)
{
using (MemoryStream msSrc = new MemoryStream(Encoding.UTF8.GetBytes(strSource)))
using (MemoryStream msTgt = new MemoryStream())
{
Compress(msSrc, msTgt);
File.WriteAllBytes(Application.StartupPath+"data.dt",msTgt.ToArray());
}
return true;
}
public static string DecompressString2String()
{
using (MemoryStream msSrc = new MemoryStream(File.ReadAllBytes(Application.StartupPath + "data.dt")))
using (MemoryStream msTgt = new MemoryStream())
{
Decompress(msSrc, msTgt);
return Encoding.UTF8.GetString(msTgt.ToArray());
}
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(CompressString2String(textBox1.Text).ToString()+"Success!");
}
private void button2_Click(object sender, EventArgs e)
{
textBox2.Text = DecompressString2String();
}
再補充:
我想問一下,你要實現的是字元串加密?還是用於網路發送?
如果你是想把一個字元串轉化為另一種形式,讓別人看不懂,那就用加密技術,如果,是想實現將字元發送到遠程,也可以把我說的文件流改寫為網路流,但是你說的字元串轉換,我實在不明白?
要知道,字元串本身是由位元組數組組成,當你加壓之後,它本身的順序就會被打亂,而你UTF-8的字元集是有限的(不是任意的位元組組合都可以被認為是字元的),
簡單地說就是像你那樣做,你把加壓後的位元組數組(經過壓縮演算法轉換後的二進制數據)再轉化為字元串,就會造成數據丟失的情況,於是操作也就不會成功了。