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

私の問題は非常に単純です:

これら 2 つの方法で生成されたサイズを比較すると、3 603 443 バイトと 3 604 081 バイトです。また、2 番目の方法で生成されたファイルを解凍することはできません。

ASCIIエンコーディングを使用したためかもしれませんが、圧縮するファイルはテキストではなく、バイナリファイルです。

誰でもそれを解決する方法を説明できますか? ファイルを文字列に読み取って圧縮する必要があります。(ファイルをバイト[]に直接読み込みたくありません)。

どうもありがとう、

よろしくお願いします、

ニクセウス

4

1 に答える 1

1

バイナリ データを文字列に入れることはできません。すべてのバイト値に Unicode コードポイントがあるわけではありません。ASCII エンコーディングを使用すると、同様に常に回復不能なデータ損失が発生します。バイト値 0 ~ 127 の文字しかありません。より高い値では ? が生成されます。

確かに byte[] を文字列に変換できますが、エンコードする必要があります。そのために使用される標準エンコーディングは、Convert.ToBase64String() メソッドから .NET で利用できます。Convert.FromBase64String() を使用して byte[] を再​​度復元します。必然的に、それはそれほどコンパクトではなく、byte[] 内の元のデータよりも 4/3 大きくなります。

そのように有効な .7z アーカイブを作成することはできません。もちろん、可能な限り最もコンパクトなストレージを使用し、それはバイトです。FileStream を CompressStream() メソッドに渡す必要があります。

于 2013-09-22T18:08:29.693 に答える