我想压缩1.7Kb的txt文件,其中只包含数字字符串。 数据只是读取不同电压下的电流(100个条目) 想要在只有512位内存的智能卡中压缩和写入它。 任何人都可以帮助C#中提供的压缩技术。 我已经尝试过gzip n Lzma n常见的技术,例如差异机制,但我只能达到1kb。 请在C#中提供一些解决方案
答案 0 :(得分:1)
GZipStream
为您提供的文件大于预期的原因是GZipStream
生成整个存档文件,而不仅仅是输入的压缩等效文件。请改用DeflateStream
,使用完全相同的算法压缩到一小部分。
编辑#2 :但是这样可以节省不超过144位,对你来说还不够好。压缩文件对于一个小文件来说是如此之大,因为Huffman表是常量大小,而微软的实现有缺陷。 DotNetZip具有相同的格式但不是同一个问题。或者您也可以使用SharpZipLib
支持另一种有趣的算法(格式)(bzip2);使用SetLevel(9)
强制库可以为您提供最大压缩级别。
一个很好的解释为什么微软压缩对你来说如此糟糕,以及为什么即使使用相同的格式(基本算法),DotNetZip或SharpZipLib也可以做得更好,Mark Adler在this answer。
答案 1 :(得分:0)
解决方案可能包括将数据存储为binary => 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());
}
答案 2 :(得分:0)
100个条目的512位表示每个条目大约5位。你将无损地接近(我认为你需要)这样的东西的唯一方法是,如果数据在样本之间有一些显着的可预测性,那么预测和实际之间的差异足够小,可以平均编码以5位。否则就没有希望。
我确信你可以压缩它小于1.7KB。如果它只是数字(虽然我想知道你有什么令人难以置信的测量设备,每个样本需要17位数),那么你应该能够将它降低到大约700字节。
如果您以实际精确度表示样本,那么您应该可以将数字降低很多。每个样本可能有五位数?然后你可以接近200字节。从64字节(512位)开始还有很长的路要走。
答案 3 :(得分:-1)
您可以使用7ZipSharp库。这非常有效:)