数字の文字列のみを含む 1.7Kb の txt ファイルを圧縮したいと考えています。データは、さまざまな電圧で電流を読み取っただけです (100 エントリ) メモリが 512 ビットしかないスマート カードに圧縮して書き込みたい。C# で利用可能な圧縮技術を手伝ってくれる人はいますか。gzip n Lzman n 差分メカニズムなどの一般的な技術をすべて試しましたが、最大 1kb しか到達できませんでした。C#でいくつかの解決策を提供してください
4 に答える
GZipStream
予想よりも大きなファイルが得られた理由はGZipStream
、圧縮された入力の同等物だけでなく、アーカイブ ファイル全体を生成するためです。代わりに使用DeflateStream
すると、まったく同じアルゴリズムを使用して、サイズの一部に圧縮されます。
編集#2:ただし、これは144ビットしか節約できず、十分ではありません。Microsoft の欠陥のある実装では Huffman テーブルが一定のサイズであるため、圧縮ファイルは小さなファイルに対して非常に大きくなります。DotNetZip の形式は同じですが、問題は同じではありません。または、SharpZipLib
別の興味深いアルゴリズム (フォーマット) もサポートするもの (bzip2) を使用できます。SetLevel(9)
ライブラリが提供できる最大の圧縮レベルを強制するために使用します。
Microsoft の圧縮がうまくいかなかった理由と、DotNetZip または SharpZipLib が同じ形式 (基本アルゴリズム) でもはるかにうまく機能する理由についての優れた説明は、Mark Adler によるこの回答にあります。
解決策は、データをバイナリとして格納することで構成できます => 100 エントリ、4 バイト/エントリ => 400 バイト。次に、おそらく、結果を圧縮できます。
List<float> myNumbers = ...
MemoryStream ms = new MemoryStream();
using(BinaryWriter bw = new BinaryWriter(stream))
{
foreach(var n in myNumbers)
bw.Write(n);
}
ms.Seek(0, SeekOrigin.Begin);
// Read the first 20 bytes from the stream.
byteArray = new byte[ms.Length];
count = memStream.Read(byteArray, 0, ms.Length);
File.WriteAllBytes(path, byteArray);
そして読むために:
byte[] content = File.ReadAllBytes(path);
var ms = new MemoryStream(content);
List<float> result = new List<float>()
using(BinaryReader br = new BinaryReader(ms))
{
result.Add(br.ReadSingle());
}
512 bits for 100 entries means about 5 bits per entry. The only way you're going to approach something like that losslessly (which I assume you need) is if the data has some significant predicability from sample to sample, and so the difference between the prediction and actual is small enough to be coded on average in 5 bits. Otherwise there is no hope.
I'm sure that you can compress it much smaller than 1.7KB. If it is really only digits (though I'd wonder what incredible measuring device you have that requires 17 digits per sample), then you should be able to get it down to around 700 bytes.
サンプルを実際の精度で表すと、桁数をかなり減らすことができるはずです。おそらくサンプルごとに5桁ですか?その後、200 バイトに近づくことができます。64 バイト (512 ビット) からはまだ長い道のりです。
You can use 7ZipSharp library. It's very effective:)