Различать биты после "битовой начинки"
Я написал фрагмент кода, чтобы добавить "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++;};
}
}