gpt4 book ai didi

c++ - 下一个 block 的偏移量不正确(DEFLATE/PNG)?

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:29 25 4
gpt4 key购买 nike

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

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

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

所以,我一定是登陆了错误的字节,也许吧?这应该是微不足道的,但我看不出我失败的地方,这里是相关的部分:

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(...)

我是否遗漏了第二遍之间的某些内容?

最佳答案

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

如果你有所有存储的 deflate block ,格式将是:

00 rs pq ~rs ~pq [ pqrs bytes ] ... same thing repeated ... 01 rs pq ~rs ~pq [ pqrs bytes ]

其中 ~ 表示倒数,或补数。

请注意,这将跟在 zlib header 之后,然后是 zlib 尾部。参见 RFC 1950 .

关于c++ - 下一个 block 的偏移量不正确(DEFLATE/PNG)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748439/

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