首先要了解什么是零比特插入 :点对点协议PPP(Point-to-Point Protocol)是目前使用得最广泛的数据链路层协 议。现在大部分用户是使用电话线拨号接入因特网的。而从用户计算机到ISP的链路所使用的数据链路层协议就是PPP协议。PPP协议必须保证数据传输的透明性。这就是说,不能限制网络层交下来的分组中不许出现某种比特组合。只要不出现传输差错,所有的数据都必须原封不动地传送到相邻结点。如果数据中碰巧出现了和帧定界符一样的比特组合时,就要采取有效的措施来解决这个问题。
PPP协议中,用在SONET/SOH链路时,是使用同步传输,而不是异步传输,这种情况下,PPP协议采用0比特填充的方法实现透明传输.
PPP帧格式
F
7E A
FF C
03 协议 信息部分 FCS F
7E
标志字段F(Flag)规定为0X7E,0X1E即:01111110
具体方法:
在发送端扫描整个信息字段,只要发现5个连续1,则立即填入1个0,因此在经过这种0比特填充后,可保证信息字段中不会出现6个连续1.在接收端收到1个帧时,先找到标志字段F,以确定一个帧边界,接着再对后面的比特流扫描,每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原后来的信息比特流.这样就保证了透明传输,在所传输的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的判断错误。
①信息字段中出现了和 0101111110001010
标志字段F完全一样 会被误认为是标志字段F
的8比特组合
②发送端在5个连续的 01011111010001010
1之后填入0比特再 发送端填入0比特
发送出去
③在接收端把5个连续 010011111010001010
的1之后的0比特删除 接收端删除填入的0比特
算法部分:
发送端: 利用两个数组s1和s2 其中s1存发送的二进制数,s2初始为空 遍历s1的数,同时将s1中的数依次赋值给s2,当出现1时count加1,出现0时count=0,当count=5时,s2的下一个值为0,且s2指向下一个,count=0.输出s2
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cout<<"输入字符串长度:"<<endl;
cin>>n;
string s1,s2;
int i=0;
int j=0;
int count=0;
cout<<"请输入二进制数:"<<endl;
cin>>s1;
for(i=0,j=0;i<n;i++,j++){
s2[j]=s1[i];
if (s1[i]=='1') count++;
else count=0;
if (count==5){
j++;
s2[j]='0';
}
}
cout<<"输出结果:"<<endl;
for(i=0;i<11;i++){
cout<<s2[i];
}
cout<<endl;
}
接收端: 同样两个数组s1和s2,便利且赋值,当s1中出现5个1时i减1。输出s2
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cout<<"输入字符串长度:"<<endl;
cin>>n;
string s1;
int i=0;
int count=0;
cout<<"请输入二进制数:"<<endl;
cin>>s1;
cout<<"输出结果:"<<endl;
for(i=0;i<n;i++){
cout<<s1[i];
if (s1[i]=='1') count++;
else count=0;
if (count==5){
i++;
}
}
cout<<endl;
}