繁体   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