为什么 "no code allowed to be all ones" 在 libjpeg 的霍夫曼解码中?
Why is "no code allowed to be all ones" in libjpeg's Huffman decoding?
我试图让自己确信我从他们的 FTP 服务器获得的 METEOSAT 图像实际上是有效图像。我产生了疑问,因为到目前为止我使用的所有工具都抱怨 "Bogus Huffman table definition" - 但是当我简单地注释掉该错误消息时,图像看起来很合理(地球圆盘的灰度部分)。
来自https://github.com/libjpeg-turbo/libjpeg-turbo/blob/jpeg-8d/jdhuff.c#L379:
while (huffsize[p]) {
while (((int) huffsize[p]) == si) {
huffcode[p++] = code;
code++;
}
/* code is now 1 more than the last code used for codelength si; but
* it must still fit in si bits, since no code is allowed to be all ones.
*/
if (((INT32) code) >= (((INT32) 1) << si))
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
code <<= 1;
si++;
}
如果我简单地注释掉检查,或添加检查 huffsize[p]
为非零(如在包含循环的控制表达式中),那么 djpeg
设法将图像转换为 BMP我可以毫无问题地查看它。
为什么评论说不允许全1代码?
它声称因为它们是不允许的。这并不意味着不存在不符合标准的图像。
不允许使用它们的原因是(来自标准):
Making entropy-coded segments an integer number of bytes is performed
as follows: for Huffman coding, 1-bits are used, if necessary, to pad
the end of the compressed data to complete the final byte of a
segment.
如果允许全 1 的代码,那么您最终可能会在压缩数据的最后一个字节中出现歧义,其中填充的 1 可能是另一个编码符号。
我试图让自己确信我从他们的 FTP 服务器获得的 METEOSAT 图像实际上是有效图像。我产生了疑问,因为到目前为止我使用的所有工具都抱怨 "Bogus Huffman table definition" - 但是当我简单地注释掉该错误消息时,图像看起来很合理(地球圆盘的灰度部分)。
来自https://github.com/libjpeg-turbo/libjpeg-turbo/blob/jpeg-8d/jdhuff.c#L379:
while (huffsize[p]) {
while (((int) huffsize[p]) == si) {
huffcode[p++] = code;
code++;
}
/* code is now 1 more than the last code used for codelength si; but
* it must still fit in si bits, since no code is allowed to be all ones.
*/
if (((INT32) code) >= (((INT32) 1) << si))
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
code <<= 1;
si++;
}
如果我简单地注释掉检查,或添加检查 huffsize[p]
为非零(如在包含循环的控制表达式中),那么 djpeg
设法将图像转换为 BMP我可以毫无问题地查看它。
为什么评论说不允许全1代码?
它声称因为它们是不允许的。这并不意味着不存在不符合标准的图像。
不允许使用它们的原因是(来自标准):
Making entropy-coded segments an integer number of bytes is performed as follows: for Huffman coding, 1-bits are used, if necessary, to pad the end of the compressed data to complete the final byte of a segment.
如果允许全 1 的代码,那么您最终可能会在压缩数据的最后一个字节中出现歧义,其中填充的 1 可能是另一个编码符号。