Разделить байт на полубайты и по двум полубайтам получить байт

Не могу добиться нужной работы от структуры в enum. Мне нужно из двух полубайт (тетрад) получать байт в подобной структуре. Для компактной записи у меня в одной тетраде длина (0-F) а во второй длина индексов 0-F (алгоритм LZ78). Получая значения к примеру 0х08 и 0х0F мне нужно чтобы в структуре оно объединялось в байт, который можно прочитать как 0x8F. Помогите написать структуру правильно :) Я где-то рядом с решением. Добавил пояснения к коду.

struct BYTE{
    unsigned char L:4; //Где-то в примерах unsigned L:4;
    unsigned char H:4; //Но не работает всё равно :(
};
union Byte{
    unsigned char byte;
    struct BYTE LH;
};

union Byte DILen;

unsigned char D[16];//Словарь символов из строки
unsigned char I[16];//Индексы ссылки на символы словаря
unsigned char DC,IC;//Счетчики словаря и индексов, для подсчета их кол-ва

int main(){
    
    DC = 0x09;//В словаре 9 символов
    IC = 0x0F;//И 15 индексов, ссылок на символы в словаре

    DILen.LH.L = DC;//DC это байт от 0 до F (0F max)
    DILen.LH.H = IC;//IC от 0 до F (0F max)
    
    //D[0] для хранения тетрадой размера словаря и кол-ва индексов (9F)
    D[0] = DILen.byte;//В итоге D[0]=0x09 , вместо 0x9F при значениях DC=0x09 IC=0x0F 

}
Вывод программы упаковки по алгоритму LZ78
Str: 'КРАСНАЯ КРАСКА 1' len: 16.
Print Dic&Indx. В D[0] индекс записывать длину словаря F-0 и индексов 0-F
D[0] =   I[0] = 0
D[1] = К I[1] = 0
D[2] = Р I[2] = 0
D[3] = А I[3] = 0
D[4] = С I[4] = 0
D[5] = Н I[5] = 3
D[6] = Я I[6] = 0
D[7] =   I[7] = 0
D[8] = 1 I[8] = 1
D[9] =   I[9] = 2
D[10] =   I[10] = 3
D[11] =   I[11] = 4
D[12] =   I[12] = 1
D[13] =   I[13] = 3
D[14] =   I[14] = 7
D[15] =   I[15] = 0

DicCount 8[08] IndexCount 15[0F] DILen [09]!Это тетрада DC:IC
При распаковке читаем D[0]=длина словаря F0 длина индексов 0F(полубайты)
Если индекс =0 увел. индекс словаря, иначе символ по инднксу

Ответы (0 шт):