Различать биты после «битовой начинки» - PullRequest
0 голосов
/ 11 февраля 2019

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

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

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

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

O» обозначает заполненный «0».)

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

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

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

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

#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++;};
    }
}
0 голосов
/ 11 февраля 2019

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

AAAAA

«Наполнение» дает:

AABAABA

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

AABBAABBA

Или вы можете «снять» его:

AAAAAA

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

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

...