我正在尝试按照此处列出的包文件格式从 git pack 文件中读取 git 对象。一旦我遇到压缩数据,我就会遇到问题。我正在尝试使用System.IO.Compression.DeflateStream来解压缩 zlib 压缩对象。我基本上通过跳过前 2 个字节来忽略 zlib 标头。无论如何,第一个对象的这 2 个字节是 789C。现在麻烦开始了。
1)我只知道解压对象的大小。DeflateStream 上的 Read 方法文档指出它“将许多解压缩的字节读取到指定的字节数组中”。这就是我想要的,但是我确实看到人们将此计数设置为压缩数据的大小,我们中的一个人做错了。
2)我认为我得到的数据是正确的(看起来正确的人类可读数据),但是它正在推进底层流,我一直把它给到最后!例如,我要求它提供 187 个解压缩字节,然后一直读取剩余的 212 个字节直到流的末尾。因为整个流是 228 字节,并且在 deflate 读取 187 字节结束时流的位置现在是 228。我不能向后寻找,因为我不知道压缩数据的结尾在哪里,并且也不是我使用的所有流都是可搜索的。这是消耗整个流的预期行为吗?