![]() ![]() |
Полубайтово пакетиране
Да разгледаме представянето на цифрите от 0 до 9 в кодова таблца ASCII. На 0 съответства 30 (в шестнайсетична бройна система), а на 9 – съответно 39. Разписваме двоичните стойности съгласно тази информация и получаваме:
Цифра |
Двоично |
0 |
0011 0000 |
1 |
0011 0001 |
2 |
0011 0010 |
3 |
0011 0011 |
4 |
0011 0100 |
5 |
0011 0101 |
6 |
0011 0110 |
7 |
0011 0111 |
8 |
0011 1000 |
9 |
0011 1001 |
Забелязваме, че във всяко едно от представянията имаме 0011 в старшите 4 бита. Очевидно, това е излишна информация, на базата на чието отстраняване може да се извърши компресия.
![]() |
Полубайтово пакетиране Идеята на полубайтовото пакетиране е използвайки такива повторения в кодовите таблици да събира по две цифри в 1 байт. |
![]() |
Пример Числото 45, което стандартно се записва в 2 байта ( 0011 0100 0011 0101 ) можем да запишем в един като 0100 0101, премахвайки излишната информация от старшите битове. |
Ако входното съобщение съдържа само цифри, коефициентът на компресия е около 2. Тъй като такива съобщения не се срещат толкова често в практиката, обикновено при смесени такива се пакетират само цифрите, а останалата част се предава в некодиран вид. За отделяне на пакетираните символи от останалите се използват т.н. “кодиращи групи”.
Кодиращата група (разделена на отделни байтове) изглежда така:
флаг |
брояч |
|
|
...... |
|
Където:
- флаг е специален символ указващ, че следва кодираща група;
- брояч показва колко байта кодирана информация следват
Минимиалната дължина на кодиращата група е 3 байта. Понякога, за да се спечели един допълнителен полубайт, кодиращата група използва полубайтов брояч. Тогава нейният формат добива вид:
флаг |
|
|
...... |
|
В този случай минималната дължина на кодиращата група се редуцира до 2 байта, но това налага и допълнително ограничение в дължината на поредицата (понеже броячът може да указва по-малък брой последващи байтове с пакетирани цифри).
Когато се използва 1 байтов брояч, минималния брой цифри, които трябва да се пакетират, за да бъде кодирането ефективно е 6:
1 |
2 |
3 |
4 |
5 |
6 |
||||||
флаг |
брояч |
|
|
|
В този пример, печалбата е 1 байт. Очевидно е, че тя нараства с всеки допълнителен байт от входното съобщение, приближавайки постепенно коефицента на компресия за поредицата към 2.
![]() ![]() |