1

我下载了 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[]。

这是我的尝试:

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 编码,但我要压缩的文件不是文本,而是二进制文件。

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

非常感谢,

此致,

尼克修斯

4

1 回答 1

1

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

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

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

于 2013-09-22T18:08:29.693 回答