2013-09-22 61 views
1

我下載了SevenZipSharp Lib以便壓縮一些文件。使用SevenZipSharp從內存壓縮文件,奇怪的錯誤

我用這個以壓縮文件:

var libPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "7-zip", "7z.dll"); 
SevenZip.SevenZipCompressor.SetLibraryPath(libPath); 
SevenZip.SevenZipCompressor compressor = new SevenZipCompressor(); 
compressor.CompressFiles(@"C:\myTestFile.mdf", new string[] { @"C:\myTestFileCompressed.7z" }); 

有了這個,我的文件被壓縮whitout問題。我可以解壓縮它。現在

...我想壓縮相同的文件,但是,而不是直接壓縮文件,我想:

  • 讀取文件中的字符串。是的,在一個字符串中,而不是在一個字節[]中。
    • 將字符串轉換爲字節[] 將字節[]壓縮到另一個字節[]。

這裏是我的嘗試:

string strToCompress = File.ReadAllText(@"C:\myTestFile.mdf"); 
SevenZipCompressor compressor = new SevenZipCompressor(); 
byte[] byteArrayToCompress = Encoding.ASCII.GetBytes(text); 
MemoryStream stream = new MemoryStream(byteArrayToCompress); 
MemoryStream streamOut = new MemoryStream(); 
compressor.CompressStream(stream, streamOut); 
string strcompressed = Encoding.ASCII.GetString(streamOut.ToArray()); 
File.WriteAllText(@"C:\myfileCompressed.7z",strcompressed); 

我的問題很簡單:

如果我比較由這2種方法生產的規模,它的3 603 443字節與3 604 081字節。 另外,我不能解壓第二種方法產生的文件。

也許是因爲我使用了ASCII編碼,但是我壓縮的文件不是文本,而是一個二進制文件。

任何人都可以解釋我如何解決它嗎?我需要將我的文件讀取到一個字符串並壓縮它。 (我不想直接讀取文件到一個字節[])。

非常感謝,

最好的問候,

Nixeus

回答

1

你不能把二進制數據轉換成字符串,不是每一個字節的值有一個Unicode碼點。使用ASCII編碼同樣會造成不可挽回的數據丟失,它只有字節值爲0到127的字符,較高的值會產生一個?

您當然可以將一個字節[]轉換爲一個字符串,它需要編碼爲。用於此的標準編碼可從Convert.ToBase64String()方法的.NET中獲得。使用Convert.FromBase64String()再次恢復byte []。不可避免地,它不會像緊湊的一樣,它會比原始數據在字節[]中大4/3。

您永遠無法生成有效的.7z存檔,它當然使用最緊湊的可能存儲空間,即字節。您必須將FileStream傳遞給CompressStream()方法。