C 区分“后的位”;“钻头填料”;
我已经编写了一段代码,在比特流中连续6个“1”之后添加一个“0”。但是如何解码呢 这里是一个一比特流的示例:C 区分“后的位”;“钻头填料”;,c,binary,bit,avr,bitstuffing,C,Binary,Bit,Avr,Bitstuffing,我已经编写了一段代码,在比特流中连续6个“1”之后添加一个“0”。但是如何解码呢 这里是一个一比特流的示例: original = {01101111110111000101111110001100...etc...} stuffed = {011011111O101110001011111O10001100...etc...} (“O”代表填充的“0”) 如您所见,在每个“111111”之后都添加了一个“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?