我编写了一段代码,在位流中连续6个连续的“ 1”之后添加“ 0”。但是如何解码呢?
以下是一个比特流的示例:
----- Installing 'pygame' -----
Collecting pygame==1.9.5.dev0
Could not find a version that satisfies the requirement pygame==1.9.5.dev0 (from versions: 1.9.2rc1, 1.9.2, 1.9.3, 1.9.4.dev0, 1.9.4rc1, 1.9.4)
No matching distribution found for pygame==1.9.5.dev0
----- Failed to install 'pygame' -----
(“ original = {01101111110111000101111110001100...etc...}
stuffed = {011011111O101110001011111O10001100...etc...}
代表填充的O
”。)
您可以看到,在每个“ 111111”之后都添加了“ 0”,并且要检索原始流,必须将其删除。简单。
但是...如果原始流与填充的流具有相同的形式怎么办?我怎么知道是否必须删除这些位?!
答案 0 :(得分:2)
我认为您对基本知识感到困惑。假设您要在2 As之后添加B。这不是“塞”:
AAAAA
“填充”功能为您提供:
AABAABA
以上内容为“已填充”或“未填充”。换句话说,您可以再次填充它:
AABBAABBA
或者您可以“解压缩”它:
AAAAAA
如果原始流与填充的流具有相同的形式怎么办?
因此,如果一个比特流中有10个连续的1,那么它显然没有塞满。对于不能填充的 比特流,您不能说相同的话。
答案 1 :(得分: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++;};
}
}