¿Cómo crear un árbol Huffman desde el encabezado FFC4 (DHT) en el archivo jpeg?

Pensé que podría resolver esto yo mismo, pero parece que no estoy avanzando en absoluto.

Ok, el fondo:

Necesito crear un árbol de códigos Huffman a partir de la información proporcionada por el encabezado FFC4, DHT (Definir tabla Huffman) en un archivo jpg. El encabezado DHT define la tabla Huffman de esta manera:

1) Una serie de 16 bytes. Cada byte define cuántos símbolos tienen un código Huffman de n cantidad de bits donde n es la posición del byte en la serie. (¡¿Eso tiene sentido? !!) Por ejemplo, los datos en bruto en hexadecimal son:

00 01 05 01 01 01 ... 00

esto significa que

Num of bits:    1   2   3   4   5   6   7 ...  16  
Num of codes:   00  01  05  01  01  01  01 ... 00

2) Después de la lista de 16 bytes, aparecen los símbolos reales. Por ejemplo

00 01 02 03 04 05 06 07 08 09 0A 0B

3) Combinando las dos partes vemos que son:
00 códigos con 1 bit.
01 códigos con 2 bits: tome el primer símbolo de la lista: 00
05 códigos con 3 bits: tome los siguientes 5 símbolos de la lista: 01 02 03 04 05
.. y as

4) Finalmente, tenemos que resolver los códigos reales de Huffman a partir de la información anterior. Si eres un genio matemático, es posible que ya hayas descubierto que estos códigos se pueden resolver simplemente incrementando un número binario con el número apropiado de bits para cada código nuevo a una determinada longitud de bits. Cuando la longitud del bit aumenta, simplemente incremente el número binario y luego duplíquelo y continúe. Resulta obvio para todos los demás cuando ha dibujado a mano varios de estos árboles binarios ...

5) Entonces este es el código que usé para resolver los códigos de Huffman y almacenarlos en una matriz: (primero leí los datos en 1) y los puse en una matriz: dhtBitnum)

            int binaryCode = 0;
            count = 0;
            StringBuffer codeString = new StringBuffer();               

            //populate array with code strings
            for (int numBits=1; numBits<=16; numBits++) {

                //dhtBitnum contains the number of codes that have a certain number of bits
                for (int i=1; i<=dhtBitnum[(numBits-1)]; i++) {

                    //turn the binary number into a string
                    codeString.append(Integer.toBinaryString(binaryCode)); 
                    //prepend 0s until the code string is the right length
                    for(int n=codeString.length(); n<numBits; n++) {
                        codeString.insert(0, "0");
                    }
                    //put the created Huffman code in an array
                    dhtCodes[count]=codeString.toString();
                    binaryCode++;
                    count ++;
                    codeString.delete(0, codeString.length());
                }
                binaryCode = binaryCode << 1;

            }

Una vez que he generado los códigos de Huffman y los he almacenado en orden, puedo agregar los símbolos a los que se refieren en orden a medida que aparecen en 2). Puede que esto no sea terriblemente elegante, pero parece funcionar al menos y crea las tablas correctas.

6) Si alguien sigue siguiendo esto, mereces una medalla.

7) Ahora el problema es que me gustaría almacenar esta información en un árbol binario para poder decodificar de manera eficiente los datos de la imagen jpg más adelante, en lugar de buscar en las matrices cada vez. Desafortunadamente, no puedo encontrar una manera limpia y eficiente de hacer esto directamente a partir de la información proporcionada en los encabezados jpg como se indica arriba.
La única forma en que puedo pensar es trabajando primero los códigos de Huffman como se indica arriba, luego implementando algún método que cree nodos según sea necesario y guarde los símbolos en el lugar apropiado, usando los códigos como una especie de dirección. Sin embargo, esto parece una forma tan indirecta que también está duplicando la información que necesito, estoy seguro de que debe haber un método mucho mejor y más simple.

8) Entonces, si alguien entendiera mis divagaciones, estaría muy agradecido por algunas sugerencias. Me doy cuenta de que este es un problema muy específico, pero si nada más, la información anterior podría ser útil para alguien. Todavía soy muy nuevo en esto, así que disculpe mi ignorancia, ¡el código fácil de entender es especialmente bienvenido!

Respuestas a la pregunta(2)

Su respuesta a la pregunta