解码JPEG哈夫曼块(表)

15

以下区块是由哈夫曼区块标记嵌套而成的

-HUFF---------------------------------------------------------------------0084-
  10    0    1    2    4    3    4    6    5    6    8    a    9    4    2    3
   0    1    2   11    0    3    4   21    5   12   31    6   41   51   61   13
  22   71   81   91   a1   14   32   b1   d1   f0   15   23   35   42   b2   c1
   7   16   24   33   52   72   73   e1   25   34   43   53   62   74   82   94
  a2   f1   26   44   54   63   64   92   93   c2   d2   55   56   84   b3   45
  83   46   a3   e2
-------------------------------------------------------------------------------

0084是整数表示的表的长度,不包括在此块中

根据JPEG标准,第一个地址显然将其作为目标0(0x10)处的AC表

从那里开始,它显然是一张霍夫曼表。

那么,它是如何解码的呢?


"0084是表的长度,表示为整数" - 你的意思是以十进制(10进制)的整数表示。这些数字都是整数。长度最初为0x0054 - 一个十六进制(16进制)的整数 - 你已经为我们转换成了十进制。 - Robino
我的笔记中应该很明显,这是使用stdio.h库中的printf函数中的格式说明符 %04i 打印出来的,它是带有前导零和至少四个数字的有符号整数的说明符。 - Supernovah
我同意,如果一个人习惯将整数的概念与整数十进制相等,那么这一点必须是显而易见的。在表示用十六进制编写的(整)数的字节海洋的背景下,在实际DHT具有相同长度的位置上,它本身以与其余数据相同格式的两个字节表示,这就不那么明显了。 - Robino
在DHT中,表的长度是紧接着表数据前面的两个字节。 - Robino
1个回答

23

在0x10之后的下一个16个字节告诉你每种长度的代码数量。在你的例子中,长度为1位的代码有0个,长度为2位的代码有1个,长度为3位的代码有2个,长度为4位的代码有4个,长度为5位的代码有3个,以此类推。

然后按顺序跟随这些代码对应的值。再次参考你的例子:

Code length | Number | Symbol(s)
------------+--------+----------
1 bit       | 0      |
2 bits      | 1      | 0x01
3 bits      | 2      | 0x02 0x11
4 bits      | 4      | 0x00 0x03 0x04 0x21
5 bits      | 3      | 0x05 0x12 0x31
... etc
你可以从顶部向下构建一个二叉树,按顺序分配符号。在这个例子中,你得到:
Symbol | Code 
-------+------
0x01   | 00
0x02   | 010
0x11   | 011
0x00   | 1000
0x03   | 1001
0x04   | 1010
0x21   | 1011
...etc

非常感谢,这对我理解有很大帮助 :) - Supernovah
编辑:重新阅读答案,它是代码的长度,然后是码字!(码字总是16个吗?)那么我就知道了我的问题的答案!谢谢 - muuh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接