【问题标题】:Discriminate bits after "bit stuffing"在“位填充”之后区分位
【发布时间】:2019-07-04 12:20:25
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

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

标签: c binary bit avr bitstuffing


【解决方案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++;};
    }
}

【讨论】:

    【解决方案2】:

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

    AAAAA
    

    它给你的“填充”:

    AABAABA
    

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

    AABBAABBA
    

    或者你可以'unstuff'它:

    AAAAAA
    

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

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

    【讨论】:

      猜你喜欢
      • 2020-02-14
      • 2017-07-01
      • 2011-02-05
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多