gpt4 book ai didi

c# - 另一个 DeflateStream 解压问题(使用 using 和内存流)

转载 作者:行者123 更新时间:2023-11-30 22:35:52 25 4
gpt4 key购买 nike

首先,我注意到压缩对象比纯粹以二进制形式表示对象需要更多的字节。 (228 比 166)。

其次,我似乎无法解压它。

此外,我无法使用出色的 CopyTo 功能,因为我没有 .NET 框架的第 4 版。

最后一个 DeflateStream using block 需要做什么?

MyClass MyObj = new MyClass();
MyObj.MyProp1 = true;
MyObj.MyProp2 = "Dee";
MyClass MyObAfterSerDeser = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, MyObj);
byte[] prebytes = ms.ToArray(); // length 166.
ms.SetLength(0L);
using(MemoryStream tmpms = new MemoryStream())
{
using (DeflateStream dsc = new DeflateStream(tmpms, CompressionMode.Compress))
{
dsc.Write(prebytes, 0, prebytes.Length);
tmpms.WriteTo(ms); // unforunately though, just want the # of compressed bytes.
}
}
byte[] cbytes = ms.ToArray(); // length 228. Longer than uncompressed version!
ms.SetLength(0L);

using (MemoryStream tmpms = new MemoryStream())
{
tmpms.Write(cbytes, 0, cbytes.Length);
tmpms.Position = 0;
using (DeflateStream dsd = new DeflateStream(tmpms, CompressionMode.Decompress))
{
byte[] dbytes = new byte[cbytes.Length];
dsd.Read(dbytes, 0, dbytes.Length);
int offset = ReadAllBytesFromStream(dsd, dbytes); // written by Mr. Skeet.
// dsd.Write(dbytes, 0, cbytes.Length);
// dsd.Read(dbytes, 0, dbytes.Length);
ms.Write(dbytes, 0, offset);
}
}
MyObAfterSerDeser = (MyClass)bf.Deserialize(ms);
}

最佳答案

不能保证放气总是会导致更小的尺寸(尽管在这种情况下它应该只使用“存储/原始/未放气”部分)。

.NET deflate 实现(也用在 GZipStream 中)是 known to be particular bad (虽然符合)在编码小的和/或已经压缩的数据时。有第 3 方库(包括 DotNetZip)可以纠正 .NET BCL 中存在的这两个问题。

当我进行放气压缩(对小块数据)时,我有一个“放气”标志,因此我存储的流只是有时放气,这取决于放气是否“值得”。

快乐编码。

关于c# - 另一个 DeflateStream 解压问题(使用 using 和内存流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7278140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com