Различать биты после "битовой начинки"

Я написал фрагмент кода, чтобы добавить "0" после 6 последовательных "1" в потоке битов. Но как его расшифровать?

Вот пример одного потока битов:

original = {01101111110111000101111110001100...etc...}

stuffed  = {011011111O101110001011111O10001100...etc...}

(O"стоять за чучела"0".)

Как видите, после каждого '111111' добавлялось '0', и для извлечения исходного потока его необходимо удалить. Легко.

Но... Что, если исходный поток имел ту же форму, что и наполненный? Как я узнаю, нужно ли мне удалять эти биты?!

2 ответа

Я думаю, что вы путаете с основами. Притворись, что хочешь добавить B после 2 As. Это не "чучело":

AAAAA

"Фарш" дает:

AABAABA

Выше либо "чучела" или "не чучела". Другими словами, вы можете заполнить это снова:

AABBAABBA

Или вы можете "снять" это:

AAAAAA

Что если исходный поток имеет ту же форму, что и заполненный?

Таким образом, если поток битов имеет 10 последовательных единиц, то он явно не заполнен. Вы не можете сказать то же самое для потока битов, который мог бы быть наполнен.

Мой вопрос был таким тупым... Но было уже поздно!

Вот кусок кода, который я написал. Требуется два потока битов. Длина заполняемого потока указывается в его первом байте. Это работает хорошо, за исключением того, что новая длина после начинки еще не обновлена. Я использовал макрос, чтобы он был более читабельным.

#include    "bitstuff.h"
#include    <stdio.h>
#include    <stdlib.h>
#include    <inttypes.h>
#define     sbi(byte, bit)  (byte = byte  |  (1 << bit))
#define     cbi(byte, bit)  (byte = byte & ~ (1 << bit))
#define     ibc(byte, bit)  (~byte & (1 << bit))
#define     ibs(byte, bit)  (byte & (1 << bit))
#define     clr(byte)       (byte = 0)

void    bitstuff(uint8_t* stream, uint8_t* stuff) {

        int8_t      k = 7, b = 7;
        uint8_t     row = 0;
        uint8_t    len = 8**stream++;

        stuff++;

        while(len--) {

            if(ibs(*stream, k--)) {

                row++;

                if(row==5) {

                    cbi(*stuff, b--);
                    if(b<0) {b=7; stuff++;};
                    sbi(*stuff, b--);
                    if(b<0) {b=7; stuff++;};
                }

                else {

                    sbi(*stuff, b--);
                    if(b<0) {b=7; stuff++;};
                }
            }
            else {

                clr(row);
                cbi(*stuff, b--);
                if(b<0) {b=7; stuff++;};
            }

        if(k<0) {k=7; stream++;};
    }
}
Другие вопросы по тегам