Вы можете создать большое дерево наследования просто для изменения одного из N поведения. И вы можете создать второе большое дерево наследования, чтобы изменить второе из N поведения.
Но вы также можете разгрузить свое дерево, создав маленькие деревья стратегий.
Так что, если вы заметили, что добавляете все больше и больше классов просто для того, чтобы добавить некоторые изменения в какое-то поведение - пришло время снабдить ваши классы стратегиями.
Следующие 16 байтов после 0x10 сообщают вам, сколько кодов каждой длины. В вашем примере есть 0 кодов длиной 1 бит, 1 код длиной 2 бита, 2 кода длиной 3 бита, 4 кода длиной 4 бита, 3 кода длиной 5 бит и т. Д.
затем следуют значения, закодированные этими кодами, по порядку. Снова из вашего примера:
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