问题标签 [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 投票
3 回答
254 浏览

.net - 防止 GZipStream/DeflateStream 尝试消耗超过压缩数据

我有一个文件可以创建如下:

现在当读取文件时

事实证明GZipStream(对于 也是如此DeflateStream)从 中读取 16384 个字节stream,而不是在我检查的情况下实际的 13293 个压缩字节。

假设我事先既不知道文件压缩部分的大小,也不知道压缩数据后面的字节数,有没有办法使用 GzipStream/DeflateStream

  1. 所以它只从stream
  2. 或者至少弄清楚压缩数据部分的大小是多少,所以我可以stream.Position -= actuallyRead - compressedSize手动?
0 投票
1 回答
247 浏览

.net - Flush 方法对 DeflateStream 有什么作用?

Flush 方法对 DeflateStream 有什么作用?

DeflateStream.Flush 方法的描述是:

将当前流对象的内部缓冲区的内容刷新到底层流。

这是一个准确的描述吗?如果是这样,这意味着什么?

详细说明混淆点: DeflateStream 构造函数需要一个 Stream 参数,描述为“要压缩或解压缩的流”。那是“底层流”吗?如果是这样,为什么要将缓冲区刷新到正在压缩或解压缩的流中?如果不是,那么什么是“底层流”?

0 投票
1 回答
425 浏览

c# - 放气流不读

DeflateStream.Read 不起作用,我正在尝试从压缩的内存流中读取,但 read 的字节数组参数仍然为空。

arr始终为空(所有字节均为零), memoryStream.ToArray() 有数据。

快速观看 arr 参数

0 投票
2 回答
599 浏览

c# - DeflateStream 将底层流推进到结束

我正在尝试按照此处列出的包文件格式从 git pack 文件中读取 git 对象。一旦我遇到压缩数据,我就会遇到问题。我正在尝试使用System.IO.Compression.DeflateStream来解压缩 zlib 压缩对象。我基本上通过跳过前 2 个字节来忽略 zlib 标头。无论如何,第一个对象的这 2 个字节是 789C。现在麻烦开始了。

1)我只知道解压对象的大小。DeflateStream 上的 Read 方法文档指出它“将许多解压缩的字节读取到指定的字节数组中”。这就是我想要的,但是我确实看到人们将此计数设置为压缩数据的大小,我们中的一个人做错了。

2)我认为我得到的数据是正确的(看起来正确的人类可读数据),但是它正在推进底层流,我一直把它给到最后!例如,我要求它提供 187 个解压缩字节,然后一直读取剩余的 212 个字节直到流的末尾。因为整个流是 228 字节,并且在 deflate 读取 187 字节结束时流的位置现在是 228。我不能向后寻找,因为我不知道压缩数据的结尾在哪里,并且也不是我使用的所有流都是可搜索的。这是消耗整个流的预期行为吗?

0 投票
1 回答
81 浏览

c# - 序列化和压缩类到文件

我正在尝试将一个类写入文件并从文件中打开该类。这对我有用;但是,文件大小非常大。(65 MB,压缩成 .rar 为 1MB)。

这让我有理由认为我可以在写入文件之前压缩数据。

我原来的功能是;

为了压缩我尝试了以下方法,但是在加载到系统类时这似乎无法正常工作:

我是否错误地使用了 DeflateStream?我能做些什么来完成这项工作?

0 投票
0 回答
251 浏览

c# - Deflatestream - 在解析完成之前到达流的末尾

我尝试将列表写入 FileStream。由于对象太大,我将列表分成均匀分布的块,并使用 DeflateStream 将其附加到 FileStream 以压缩数据。这一切都很好。

但是,如果我尝试做同样的事情来解压缩它,它会给出一个错误:“在解析完成之前到达了流的末尾”。这是解压的代码:

我注意到的是第一批用户很好地被写入结果。但是,当它应该在第二个用户块上启动时,它会立即给出错误(似乎甚至在尝试获取第二个块之前)。我能做些什么或者是错的?

@Edit 10:43 - 16-10-2015 补充说明

如果我跳过 DeflateStream 并且只使用 FileStream,那么它就像一个魅力。

压缩方法(我调用这个函数x次,每个块一次):

0 投票
0 回答
1364 浏览

c# - 使用 deflatestream 解压缩字节流

我有一个使用 TCP 套接字连接的服务器和一个客户端。在客户端(用 C++ 编写)我使用zlib库压缩一个字符串(str):

然后我将它发送到服务器。这是我将压缩字符串写入套接字的代码行:

在服务器(用 C# 编写)上,我从套接字接收压缩字节流并使用 DeflateStream 类对其进行解压缩:

这是解压功能:

压缩过程和通过套接字发送压缩字节有效,但我在上面的解压缩函数的行中遇到异常decompressor.CopyTo(output);:System.IO.InvalidDataException:块长度与其补码不匹配。

有人知道问题是什么,我该如何解决?

编辑:我已经尝试在解压过程开始前跳过前两个字节。

0 投票
1 回答
567 浏览

c# - 无法压缩解压

我正在尝试通过从 WP8 中的文件读取内容来压缩和解压缩数据。我无法压缩或解压缩。而压缩结果字符串始终为空。解压时出现错误为“SYSTEM.IO.COMPRESSION.NI.DLL 中发生类型为‘System.IO.InvalidDataException’的异常,但未在用户代码中处理

附加信息:块长度与其补码不匹配。”

代码如下

请帮我弄清楚出了什么问题。

0 投票
3 回答
550 浏览

c# - 为什么我的 DeflateStream 不能通过 TCP 正确接收数据?

我在本地机器上的客户端和服务器设置上有一个 TcpClient 类。我一直在使用网络流来促进两者之间的通信成功。

展望未来,我正在尝试在通信中实现压缩。我试过 GZipStream 和 DeflateStream。我决定专注于 DeflateStream。但是,连接挂起,现在没有读取数据。

由于服务器端未读取传入数据和连接超时,我尝试了 4 种不同的实现都失败了。我将专注于我最近尝试过的两个实现,据我所知应该可以工作。

客户端被分解为这个请求:有 2 个单独的实现,一个有流写器,一个没有。

服务器收到请求,我执行
1.) 快速读取第一个字符,然后如果它符合我的预期
2.) 我继续阅读其余部分。

第一次读取工作正常,如果我想读取整个流,它就在那里。但是,我只想读取第一个字符并对其进行评估,然后继续使用我的 LongReadStream 方法。

当我尝试继续读取流时,没有要读取的数据。我猜数据在第一次读取时丢失了,但我不确定如何确定。 当我使用普通的 NetworkStream 时,所有这些代码都能正常工作。

这是服务器端代码。

编辑 NetworkStream 有一个基础的 Socket 属性,它有一个可用的属性。MSDN 对可用属性进行了说明。

获取已从网络接收并可供读取的数据量。

在调用之前可用是 77。读取 1 个字节后,值是 0。

似乎没有任何关于 DeflateStream 消耗整个底层流的文档,我不知道为什么当有明确的调用来读取特定数量的字节时它会做这样的事情。

有谁知道为什么会发生这种情况,或者是否有办法保留基础数据以供将来阅读?基于这个“功能”和我读过的一篇文章,说明必须关闭 DeflateStream 才能完成发送(刷新不起作用),似乎 DeflateStreams 在网络使用方面可能受到限制,特别是如果希望通过测试来对抗 DOS 攻击接受完整流之前的传入数据。

0 投票
1 回答
3454 浏览

c# - 从文件中创建内存 zip

DeflateStream 是否应该创建可以存储为标准 .zip 存档的存档流?

我正在尝试从本地文件创建内存中的 zip(远程发送)。我使用 DeflateStream 从本地磁盘上的文件中获取压缩字节数组:

这很好用。但是,当我将生成的字节转储到 zip 文件时:

我无法使用 Windows 内置 .zip 功能(或任何其他第 3 方存档工具)打开生成的 .zip 存档。

我现在计划的另一种方法是使用 ZipArchive - 但是这需要在磁盘上创建临时文件(首先将文件复制到单独的目录中,然后对其进行压缩,然后将其读入字节数组,然后将其删除)