1

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

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

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

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

(“ O”代表填充的“ 0”。)

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

但是...如果原始流与填充流具有相同的形式怎么办?我怎么知道我是否必须删除这些位?!

4

2 回答 2

2

我认为您对基础知识感到困惑。假设您想在 2 个 As 之后添加一个 B。这不是“填充”:

AAAAA

“填充”它为您提供:

AABAABA

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

AABBAABBA

或者你可以'unstuff'它:

AAAAAA

如果原始流与填充流具有相同的形式怎么办?

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

于 2019-02-11T04:07:38.160 回答
0

我的问题太愚蠢了……但已经晚了!

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

#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++;};
    }
}
于 2019-02-13T00:58:14.103 回答