⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 erjinzhi.txt

📁 内容为二进制码和HDB3码的转换用C语言
💻 TXT
字号:
HDB3码即三阶高密度双极性码。一、编码规则: 
1 先将消息代码变换成AMI码,若AMI码中连0的个数小于4,此时的AMI码就是HDB3码; 
2 若AMI码中连0的个数大于4,则将每4个连0小段的第4个0变换成与前一个非0符号(+1或-1)同极性的符号,用表示(+1+,-1-); 
3 为了不破坏极性交替反转,当相邻符号之间有偶数个非0符号时,再将该小段的第1个0变换成+或-,符号的极性与前一非符号的相反,并让后面的非零符号从符号开始再交替变化。 
例如: 
消息代码:1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 
AMI码: +1 0 0 0 0 -1 0 0 0 0 +1 -1 0 0 0 0 +1 -1 
HDB3码:+1 0 0 0 + -1 0 0 0 - +1 -1 + 0 0 + -1 +1 
二、HDB3码的特点: 
1 由HDB3码确定的基带信号无直流分量,且只有很小的低频分量; 
2 HDB3中连0串的数目至多为3个,易于提取定时信号。 
3 编码规则复杂,但译码较简单。 
三、解码规则 
1从收到的符号序列中找到破坏极性交替的点,可以断定符号及其前面的3个符号必是连0符号,从而恢复4个连码; 
2再将所有的-1变换成+1后,就可以得到原消息代码==================================================*/ 
/* HDB3编码 在c盘创建文本文档 hjout.txt 写入+-10随机码*/ 
#include "stdio.h" 
#include "conio.h" 
#include "math.h" 
main() 
{ 
char s ; 
int a[10]={8,8,8,8,8,8,8,8,8,8}; 
/*a[10]={8}不好用?*/ 
int n=3,i=0,j=0 ,k=0; 

FILE*fpin,*fpout ; 

/*打开待读文件*/ 
fpin=fopen("C:\\hjout.txt","r"); 
if((fpin=fopen("C:\\hjout.txt","r"))==NULL) 
{ 
printf("wo kao !!! da bu kai !!!\n"); 
getch(); 
exit(0); 
} 

/*打开待写文件*/ 
fpout=fopen("C:\\hjin.txt","w"); 
if((fpout=fopen("C:\\hjin.txt","w"))==NULL) 
/*可不用写if判断,系统会自己创建hjin.txt*/ 
{ 
printf("wo kao !!! da bu kai !!!\n"); 
getch(); 
exit(0); 
} 
/* ---------------以上是前期的准备工作--------------*/ 


/* 利用一个足够大数组暂时保存解码后的码 确定不再对其修改后 
把结果写入文本文档具体办法 就是 读文件 和 写入文件 不同步 
设置一个10位的字符型数组 要从数组写入文本的码和要写入数组的码之间 
相隔三位以上 这样可保证 写入文本的码 不会再对其修改 
对于直接在文本中修改码 目前以我的水平是做不到的 */ 

/* 需要设置 n控制1的+-号 */ 
/* 相邻符号若相同 后一个是v 指针后退三位 a[i-3]='0'; 不管是不是b */ 


s=fgetc(fpin); 
while(s!=EOF) 
{ 
/*----------------------------------------------------------*/ 
if(s=='0') { a[i]=0; i++;} /* 对0的解码 */ 

if(s=='-') { a[i]=1; 
if(n==0) {if(i-3<0) a[i+7]=0;else a[i-3]=0;a[i]=0;} 
n=0;i++;s=fgetc(fpin);} 
if(s=='+') { a[i]=1; 
if(n==1) {if(i-3<0) a[i+7]=0;else a[i-3]=0; a[i]=0;} 
n=1;i++;s=fgetc(fpin);} 


/*----------------------------------------------------------*/ 

if(j==10)j=0 ; 
/*首先要判断 数组所有的数字是否都写入文本中 循环从数组中读取数字*/ 


if(k==0&&i<8) ; /* 只运行8次*/ 
else { fprintf(fpout,"%d",a[j]); 
a[j]=8 ; 
j++; k=1;} 
/* 此if 可能存在问题 没找到 理论上i<4就是可以的 但是却得不到正确结果 */ 

/*a[j]=8的目的是 设置一个停止写入文本的条件*/ 

if(i==10)i=0 ; 
/* 循环控制 写入数组数据 防止溢出 i++=9已经写满数组所以此时 i=10*/ 

s=fgetc(fpin); 
/* 和while一起构建循环结构 fgetc读取一个字符后 指针后后移一位 
所以只需再次 赋值给s 若没有这句 会死循环 强烈注意 
程序会迅速的向硬盘中写数据*/ 
} 


while(a[j]!=8) 
{ 

fprintf(fpout,"%d",a[j]); 
j++; 
if(j==10)j=0 ; 
} 
/* 由于是滞后向文本中写数据 ,当上边的循环结束后 还有一些数据在数组中 
未写入文本中。 再次利用循环结构写入文本直到遇到8 读取数组中数据时 
读到a[9]时要 再次从a[0]开始读取。 */ 

fclose(fpin); 
fclose(fpout); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -