C 区分“后的位”;“钻头填料”;

C 区分“后的位”;“钻头填料”;,c,binary,bit,avr,bitstuffing,C,Binary,Bit,Avr,Bitstuffing,我已经编写了一段代码,在比特流中连续6个“1”之后添加一个“0”。但是如何解码呢 这里是一个一比特流的示例: original = {01101111110111000101111110001100...etc...} stuffed = {011011111O101110001011111O10001100...etc...} (“O”代表填充的“0”) 如您所见,在每个“111111”之后都添加了一个“0”,要检索原始流,必须将其删除。简单 但是。。。如果原始流的形式与填充流的形式相同

我已经编写了一段代码,在比特流中连续6个“1”之后添加一个“0”。但是如何解码呢

这里是一个一比特流的示例:

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

stuffed  = {011011111O101110001011111O10001100...etc...}
(“
O
”代表填充的“
0
”)

如您所见,在每个“111111”之后都添加了一个“0”,要检索原始流,必须将其删除。简单


但是。。。如果原始流的形式与填充流的形式相同呢?我怎么知道我是否必须移除这些碎片

我认为你对基本知识感到困惑。假装你想在2 As之后加上一个B。这不是“塞满的”:

AAAAA
“填充物”可以让你:

AABAABA
以上是“填充”或“未填充”。换句话说,您可以再次填充它:

AABBAABBA
或者您可以“取消填充”:

AAAAAA
如果原始流的形式与填充流的形式相同呢


因此,如果一个比特流中有10个连续的1,那么它显然没有被填充。对于可能被填充的比特流,你不能说同样的话

我的问题太傻了。。。但是太晚了

这里是我写的一段代码。它需要两个比特流。要填充的流的长度在其第一个字节中。除了填充后的新长度尚未更新外,它工作良好。 我使用了宏,所以它更可读

#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++;};
    }
}
#包括“bitstuff.h”
#包括
#包括
#包括

#定义sbi(字节,位)(字节=字节|)(1您的输出在第一个“填充”0(标记为O)之前只有五个1位),并丢失第六个1。这是一个输入错误,应该有六个1位吗?第二个填充0也会遇到类似的问题;之前有五个1位,但这次保留了第六个1位。您真正想做的是什么?您的文字说明一件事,而示例输出说明另一件事。如果在原始数据流中有六个1位在一行中,然后是一个0,您的输出将是一行中的六个1,然后是两个0。删除一个0将为您提供原始流。这假设您希望解码的所有数据都将首先通过编码器。不,没关系。第一位填充在五个“1”之后。“01101111111011100”=>“011011111.O.101110”。您的问题文本显示“在6个连续的“1”之后添加一个“0”;您的评论文本和示例有效地显示“在5个连续的“1”之后添加一个“0”。请确定哪一个是正确的,并修复另一个。@joe.garage为什么要删除0?0b01111110被填充,这导致了0b011111010。您为什么要删除最后的0?