使用SevenZipSharp压缩内存中的文件,奇怪的错误

时间:2013-09-22 17:43:00

标签: c# encoding ascii 7zip

我下载了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" });

有了这个,我的文件被压缩了whitout问题。我可以解压缩它。

现在......我想压缩同一个文件,但是,我想直接压缩文件,而不是:

  • 以字符串形式读取文件。是的,在一个字符串中,而不是在一个字节[]。
    • 将我的字符串转换为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编码,但我的压缩文件不是Text,而是二进制文件。

任何人都可以解释我如何解决它?我需要将我的文件读取到一个字符串并压缩它。 (我不想直接将文件读取到byte [])。

非常感谢,

致以最诚挚的问候,

Nixeus

1 个答案:

答案 0 :(得分:1)

您不能将二进制数据放入字符串中,并非每个字节值都具有Unicode代码点。使用ASCII编码同样会导致无法恢复的数据丢失,它只有字符值0到127的字符值,更高的值会产生一个?

你当然可以将byte []转换为字符串,它需要编码。用于此的标准编码在.NET中可从Convert.ToBase64String()方法获得。使用Convert.FromBase64String()再次恢复byte []。它不可避免地会变得那么紧凑,它将比字节[]中的原始数据大4/3。

你永远不能以这种方式生成有效的.7z存档,它当然使用最紧凑的存储空间,即字节数。您必须将FileStream传递给CompressStream()方法。