簡體   English   中英

使用SevenZipSharp從內存壓縮文件,奇怪的錯誤

[英]Compressing a file from memory with SevenZipSharp, stranges mistakes

我下載SevenZipSharp Lib以壓縮一些文件。

我用這個來壓縮文件:

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" });

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

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

  • 讀取文件中的字符串。 是的,使用字符串而不是byte []。
    • 將我的字符串轉換為byte []壓縮byte []到另一個byte []。

這是我的嘗試:

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);

我的問題很簡單:

如果我比較這兩種方法產生的大小,則分別是3 603 443字節和3 604 081字節。 另外,我無法解壓縮第二種方法生成的文件。

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

有人可以向我解釋如何解決嗎? 我需要將文件讀取為字符串並進行壓縮。 (我不想直接將文件讀取為byte [])。

非常感謝,

最好的祝福,

Nixeus

您不能將二進制數據放入字符串中,不是每個字節值都有一個Unicode代碼點。 同樣,使用ASCII編碼總是會導致無法挽回的數據丟失,它只有0到127字節值的字符,較高的值會產生一個?。

您當然可以將byte []轉換為字符串,需要對其進行編碼 .NET中的Convert.ToBase64String()方法提供了用於此目的的標准編碼。 您可以使用Convert.FromBase64String()再次恢復byte []。 不可避免的是它不會那么緊湊,它將比原始數據(byte [])大4/3。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM