C++ 下一个块的偏移量不正确(DEFLATE/PNG)?

C++ 下一个块的偏移量不正确(DEFLATE/PNG)?,c++,png,deflate,C++,Png,Deflate,EDIT:这是指IDAT中的实际数据流块(以及唯一的IDAT块)。我成功地浏览了相关的关键区块,从IHDR到IEND——问题在于实际区块之间的导航。 因此,出于好奇,我正在做一个小宠物项目,编写一个PNG加载程序,并首先对未压缩文件进行实验,以真正了解其要点。对于压缩类型00(无压缩),如果最终块有问题,则其大小应为2^16-1、65535或更小 因此,我正确加载第一个块,并尝试添加最后一个块长度的偏移量(该偏移量是可变的,如果是最后一个,则为65535或更小)。因此,我希望65535的偏移量应

EDIT:这是指IDAT中的实际数据流块(以及唯一的IDAT块)。我成功地浏览了相关的关键区块,从IHDR到IEND——问题在于实际区块之间的导航。

因此,出于好奇,我正在做一个小宠物项目,编写一个PNG加载程序,并首先对未压缩文件进行实验,以真正了解其要点。对于压缩类型00(无压缩),如果最终块有问题,则其大小应为
2^16-1
、65535或更小

因此,我正确加载第一个块,并尝试添加最后一个块长度的偏移量(该偏移量是可变的,如果是最后一个,则为65535或更小)。因此,我希望65535的偏移量应该正好落在下一个块的第一个字节上,因为最后一个字节是从0读到非包含65535的,或者65534字节是第一个块的最后一个字节。但出于某种奇怪的原因,我的未压缩PNG文件(用Photoshop输出)读取了第二个块传递的虚假数据(它使用动态哈夫曼代码将其标记为压缩和最终,因此是LZ77压缩算法的变体,在不同的图像上,它以1MB文件的100k字节标记输出77作为压缩类型等)。

所以,我一定是用错字节了,也许?这应该很简单,但我看不出我在哪里失败了,下面是相关的一点:

unsigned int accumulatedOffset = 0;
CBlock cblock; // initializes length to 0

do {

    accumulatedOffset += cblock.length; // Adds 65535 on second pass

    // Extract block header
    unsigned char bheader = IDATChunk[Description::BlockHeaderOffset + accumulatedOffset];

    // The second pass reads from the wrong byte, it seems.

} while(...)

我是不是在第二遍中遗漏了什么?

啊,谢谢你的编辑。所以你说的是放气块

如果已存储所有放气块,则格式为:

00 rs pq ~rs ~pq [ pqrs bytes ] ... same thing repeated ... 01 rs pq ~rs ~pq [ pqrs bytes ]
其中,
~
表示反义词或补语


请注意,这将跟在zlib标题后面,后面是zlib尾部。请参阅。

啊,感谢您的编辑。因此,您所说的是放气块

如果已存储所有放气块,则格式为:

00 rs pq ~rs ~pq [ pqrs bytes ] ... same thing repeated ... 01 rs pq ~rs ~pq [ pqrs bytes ]
其中,
~
表示反义词或补语


请注意,这将跟在zlib标题后面,后面是zlib尾部。请参阅。

这让我非常困惑。“压缩类型=0”您是指PNG过滤器类型(无预测)还是压缩级别?您指的是什么“块”呢?在PNG级别(IDAT)或者deflate level?deflate level,IDAT中的块,而不是IDAT块之间的块。好的。您知道必须连接IDAT内容才能获得zlib流吗?是的,我查询了所有IDAT的文件,但似乎只有一个。我正在逐步查找错误,解决后会报告。可能是som这很琐碎。让我很困惑。“压缩类型=0”你是指PNG过滤器类型(无预测)还是deflate压缩级别?你说的是什么“块”呢?在PNG级别(IDAT)或者deflate level?deflate level,IDAT中的块,而不是IDAT块之间的块。好的。您知道必须连接IDAT内容才能获得zlib流吗?是的,我查询了所有IDAT的文件,但似乎只有一个。我正在逐步查找错误,解决后会报告。可能是som这很简单。谢谢你的回答,但我相信你指的是实际的PNG块,它在块的末尾附加了CRC。IDAT块中的实际DEFLATE块应该是连续的,对吧?我尝试添加12个,几乎每个偏移量从-4到16都是为了计算出来,不走运。/我刚刚检查过,你看起来是这样的在puff.c中执行相同操作(
存储的
压缩功能00)使用
s->incnt+=len;
,只是偏移到下一个deflate块。我不知道。谢谢你的回答,但我相信你指的是在块末尾附加了CRC的实际PNG块。IDAT块中的实际deflate块应该是连续的,对吗?我尝试添加了12个和几乎每个偏移量从-4到16,为了找出答案,运气不好。/我刚刚检查过,您似乎在使用
s->incnt+=len;
在poff.c(
存储的压缩函数00)中也做了同样的操作,只是抵消了下一个放气块。我不知所措。