问题标签 [deflatestream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
638 浏览

zip - 从 MSZIP 格式压缩数据

我正在尝试读取压缩的二进制 .x 网格文件,但我的解压缩失败。该文件基本上是一些directx标头信息,然后是MSZIP格式的一堆数据(即2个字节是一个 int blockSize,2个字节是一个“幻数”,然后是blockSize放气的字节,然后重复直到没有更多数据)所以每个块我只是得到压缩字节并像这样放气-

第一个区块按预期放气。随后的块是正确的膨胀大小,但是,看似随机的,一些字节不应该是 0,通常以 4-12 个为一组。

如何在保持相同历史缓冲区的同时压缩不同的压缩数据块?

更新:经过更多研究后,看起来在 MSZIP 压缩中这些块是单独放气操作的结果,但它们之间维护着“历史缓冲区”,我不知道是否deflatestream能够处理这个问题。更新了实际问题

0 投票
2 回答
1452 浏览

c# - zip 中的 Zip 打开到未记录的 System.IO.Compression.SubReadStream

我有一个用于聚合 zip 存档中的流的功能。

这在大多数情况下都很有效。但是,如果我在一个 zip 中有一个 zip,我会在将流转换为 a 时得到一个例外DeflateStream

System.InvalidCastException:无法将“System.IO.Compression.SubReadStream”类型的对象转换为“System.IO.Compression.DeflateStream”类型。

我无法找到 Microsoft 文档SubReadStream。我希望我的 zip 在一个 zip 中作为DeflateStream. 这可能吗?如果有怎么办?

更新

仍然没有成功。我尝试了@Sunshine 使用以下代码复制流的建议:

但我得到一个

System.NotSupportedException:流不支持读取。

我检查deflateStream.CanRead了,这是真的。

我发现这不仅发生在 zip 上,还发生在 zip 中但未压缩的文件上(例如,因为太小)。当然有办法解决这个问题;肯定有人以前遇到过这种情况。我在这个问题上悬赏。

这是.NET 的源代码SubReadStream感谢@Quantic。

0 投票
0 回答
77 浏览

c# - 如何从 c# 中的存档文件中获取所有文件?

我已阅读电子邮件附件,如果存档文件,则找出存档文件中有多少文件。以及任何以编程方式使用而不存储任何临时位置的 exe。我发现以字符串或字节的形式获取附件内容。从这个字符串中,我需要获取所有文件及其内容和文件名。提前致谢

0 投票
1 回答
207 浏览

c# - 查找 DeflateStream 的编码类型

我有一个 zip 文件,里面有一个 csv 文件。我正在使用以下代码来读取文件:

zipEntry 的类型为 System.IO.Compreesion.Deflatestream。

我尝试使用 StreamReader.CurrentEncoding,但它给出了错误的编码值。

我现在正在使用这个解决方案,

但在 fileStrem.Length 处得到 NotSupportedException。

如何找到 zipEntry (File.csv) 的正确编码?

0 投票
2 回答
1328 浏览

c# - 使用 DeflateStream 时避免复制压缩数据

假设我们已经给出了一个 API 函数 f(Stream s) 来将包含在流中的二进制数据放入数据库中。我想使用 f 将文件放入数据库,但我想提前压缩数据。因此,我认为我可以执行以下操作:

但它似乎DeflateStream只写入流fileStream,但在压缩时不从中读取。在我发现的所有示例CopyTo中,流的方法都用于压缩或解压缩。但这意味着我必须在内存中保留一份压缩数据的副本,然后再将其传递f给例如:

有什么办法可以避免使用 MemoryStream?

更新 为了一些评论员的持久性,我添加了一个完整的例子:

虚拟实现中的读取操作f抛出异常:InvalidOperationException:不支持从压缩流中读取。在评论中结束讨论,我假设所需的行为是不可能的,DeflateStream但第三方库中有替代方案。

0 投票
1 回答
1297 浏览

c# - C# DeflateStream.Read() 给出 InvalidDataException

我想解压缩一个压缩字符串,以便字符串变得可用。

我使用函数 WebClient.DownloadData(String) 成功地将下载文件的内容提取到一个字节数组中。

使用 deflate 方法对字符进行逻辑压缩,因为当我下载文件(以不同的扩展名)时,7-Zip 会提供此信息:

压缩文件信息

因此,我应该使用 DeflateStream 类来解码字符串,使用函数 Read(byte[] array, int offset, int count) ;读取 MemoryStream。

我使用了一个可以在网上找到的简单功能:

当我们调用 Read() 函数时,它给出了一个 InvalidDataException :在解码时发现有效数据;使用堆栈跟踪

在 System.IO.Compression.Inflater.DecodeDynamicBlockHeader()\r\n 在 System.IO.Compression.Inflater.Decode()\r\n 在 System.IO.Compression.Inflater.Inflate(Byte[] 字节,Int32 偏移量, Int32 长度)\r\n 在 System.IO.Compression.DeflateStream.Read(Byte[] 数组, Int32 偏移量, Int32 计数)\r\n

但是,我仍然认为信息是用“放气方法”压缩的。 是否有不同/更好/有效的方式来读取数据并将其解压缩为字符串?

0 投票
1 回答
1398 浏览

c# - 字节数组中的压缩内容到字符串中未压缩的内容

我们如何创建一个简单的函数来从字节数组中获取压缩内容(使用 Deflate 方法压缩,ANSI 编码)并将其表示为字符串?

我选择这个:

如果需要,我可以看到读取 inputMemoryStream 的压缩数据,但StreamReader.ReadToEnd() 给出的 uncompressedContent 总是返回一个空字符串。根据 MSDN(https://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend(v=vs.110).aspx),它应该在读取和位置时发生已经在“流”的末尾(我对哪个流感到困惑),但是 StreamReader 没有位置,我无法更改 DeflateStream 的位置,因为它是一个没有位置和长度的流,等等

在复制之前将 compressStream 位置设置为 0 会在任何情况下导致块长度与其补码不匹配”错误。

编辑:

当我使用 RaTruong 的解决方案时:

这导致了我一直遇到的两难境地:要么我喜欢这样,并且 DeflateStream.CopyTo 函数返回“块长度与其补码不匹配”错误,要么我消耗了两个前字节,它实际上并没有带来任何错误,但是仍然不复制任何内容,然后返回一个空字符串...

如果我尝试解压缩 File 的 FileStream 而不是其字节数组,则会发生同样的情况。我使用 MSDN 中给出的解压缩功能(https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream(v=vs.110).aspx):

相同的“块长度与其补码不匹配”错误...

一件事是我的文件的扩展名不是在文件末尾添加的“.zip”,而是另一个扩展名(在这种情况下为 .23U)。当我创建一个具有相同扩展名的新文件(在这种情况下是 .23U 而不是没有扩展名)时,会发生同样的问题。

0 投票
1 回答
88 浏览

c# - 解压和压缩回不返回相同的内容

为什么我在使用 DeflateStream 解压和压缩回字节数组后没有得到相同的内容?

编码:

为什么 originalcontent != compressedBackBytes ?

0 投票
1 回答
442 浏览

c# - 在android中使用GZIP压缩流

我想压缩android设备中的数据并将其发送到ASP.net服务器端,但我不想消耗太多电力并牺牲设备资源。我尝试在 android 端使用 Deflate 流压缩数据,并在服务器端使用相同的流进行解压缩,但解压后的字符串与原始字符串不同。然后我尝试使用 GZIP 流,恢复的数据与原始数据相同。正如我所读到的,Deflate 流比 GZIP 更快。所以我该怎么做?使用 GZip 流在 Android 和 C# 之间进行数据压缩和解压缩是最佳实践吗?有没有办法恢复使用 Deflate 流压缩的数据?

0 投票
0 回答
46 浏览

c# - 将 DeflateStream 文件内容发送到 Azure 消息队列

这是关于使用C#中的TopicClient向 Azure 服务消息队列发送/接收 XML 文件的内容。

我将 XML 文件的内容作为字符串发送,我可以在 Azure 队列上看到消息,甚至可以正确读取其内容,因此当我发送纯文本 XML 文件时一切正常。

但是,由于队列中传入消息的数据限制,我必须在发送之前压缩文件,我使用 C# 的DeflateStream压缩文件的内容并将其写回文件。在接收端,我能够读取文件的内容,但它与发送的内容不同。

我怀疑这与编码有关。你能指导我了解我所缺少的吗?提前致谢。

发件人

接收者