1、k个检验元,组成长为n的序列:,称这个序列为码字。在二进制情况下,信息组总共有k2个,因此通过编码器后,相应的码字也有k2个,称这k2个码字集合为(,k)分组码。n长序列的可能排列总共有n2种。称被选取的k2个n重为许用码组,其余kn22 个为禁用码组,称Rk/n为码率。那么对于(7,3)码即为用7位长的序列表示3位信息码,7位长序列的可能排列总共有128个。许用码组有8个,其余128-8=120个禁用码组,码率为R=3/7=42.86%。对于长度为n的二进制分组码,可以表示成(n,k),通常用于前向纠错。在分组码中,监督位加到信息位之后,形成新码,在编码中,k个信息位,被编为n位长度,(n-
2、k)个监督码的作用是实现检错和纠错。 编码原理(1)根据给定的生成矩阵G,求得监督码与信息码之间呈线性关系即编码方程。(2)输入信息码,代入上述编码方程中,得到各监督码。(3)监督码附带在信息码之后,一起输出,即得到编码结果。已知线性分组码的生成矩阵 1 0 0 1 1 1 0 G = 0 1 0 0 1 1 1 0 0 1 1 1 0 1因为 C6C5C4G =C6C5C4C3C2C1C0即1 0 0 1 1 1 0 C6C5C4 0 1 0 0 1 1 1 = C6C5C4C3C2C1C0所以由上式可以得到编码方程组C6 = C6C5 = C5C4= C4=+表1 信息码、监督码、许用码对
3、照表信息组监督码码字0000000000000000111010011101010011101001110111010011101010011101001110101001110100111101001110100111101001110100 译码原理(1)根据生成矩阵计算出监督矩阵H,由H计算出伴随式S。(2)如果S=0,0,0,0,R1无错。(3)如果S与H的转置矩阵的某一行相等,则有一个错误,找到相应的错误图样E,则正确的接收到的码字R2=R1+E(二进制异或)。(4)译出的码为R2的前3位。(5)如果S不等于H转置的任意一行,则有两个或多个错误,不能得到正确的译码结果。 G=IkP(
4、3)其中Ik是k阶单位矩阵,这里k=3 1 1 1 0 G = 0 1 1 1(4) 1 1 0 1 监督矩阵H=QIr (5) 1 0 0 00 1 0 0Ir = 0 0 1 0(6) 0 0 0 1 P=QT(7)所以由(4)得 1 0 11 1 1 Q = 1 1 0(8) 0 1 1因此由(5)(6)(8)得监督矩阵 1 0 1 1 0 0 01 1 1 0 1 0 0Q = 1 1 0 0 0 1 0 (9) 0 1 1 0 0 0 14.算法实现4.1图片处理 定义结构体/位图文件头定义;/其中不包含文件类型信息(由于结构体的内存结构决定,/要是加了的话将不能正确读取文件信息)t
5、ypedef struct tagBITMAPFILEHEADER /WORD bfType; /文件类型,必须是0x424D,即字符“BM” DWORD bfSize; /文件大小 WORD bfReserved1; /保留字 WORD bfReserved2; DWORD bfOffBits; /从文件头到实际位图数据的偏移字节数BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER DWORD biSize; /信息头大小 LONG biWidth; /图像宽度 LONG biHeight; /图像高度 WORD biPlanes; /位平
6、面数,必须为1 WORD biBitCount; /每像素位数 DWORD biCompression; /压缩类型 DWORD biSizeImage; /压缩图像大小字节数 LONG biXPelsPerMeter; /水平分辨率 LONG biYPelsPerMeter; /垂直分辨率 DWORD biClrUsed; /位图实际用到的色彩数 DWORD biClrImportant; /本位图中重要的色彩数BITMAPINFOHEADER; /位图信息头定义typedef struct tagRGBQUAD BYTE rgbBlue; /该颜色的蓝色分量 BYTE rgbGreen;
7、/该颜色的绿色分量 BYTE rgbRed; /该颜色的红色分量 BYTE rgbReserved; /保留值RGBQUAD; /调色板定义typedef struct tagIMAGEDATA /像素信息 BYTE blue; / BYTE green; / BYTE red;IMAGEDATA; 像素保存bool BMP:readOfBMP() cout t正在读取原文件信息,请稍后.n endl; FILE *fpi; fpi = fopen(G:学习资料信息安全基础实习ConsoleApplication1ConsoleApplication1test1.BMP, rb); if (f
8、pi = NULL) cout t无法打开文件1!n return false; /判断是否是bmp格式文件 WORD bfType; fread(&bfType, 1, sizeof(WORD), fpi); if (bfType != 0x4d42)t不是bmp格式的图片! /读取bmp文件的文件头和信息头strHead, 1, sizeof(tagBITMAPFILEHEADER), fpi);strInfo, 1, sizeof(tagBITMAPINFOHEADER), fpi); /读取调色板 for (unsigned int nCounti = 0; nCounti strIn
9、fo.biClrUsed; nCounti+) fread(char *)&(strPlanCounti.rgbBlue), 1, sizeof(BYTE), fpi);(strPlanCounti.rgbGreen), 1, sizeof(BYTE), fpi);(strPlanCounti.rgbRed), 1, sizeof(BYTE), fpi);(strPlanCounti.rgbReserved), 1, sizeof(BYTE), fpi); strInfo.biWidth = (strInfo.biWidth * sizeof(IMAGEDATA)+3) / 4 * 4; lo
10、ng width = strInfo.biWidth; long height = strInfo.biHeight; /width = ( width * sizeof(IMAGEDATA) + 3) / 4 * 4; /申请并初始化存储像素 imageDataPtr = new IMAGEDATAwidth * height; for (int i = 0; i height; +i) for (int j = 0; j width; +j) (*(imageDataPtr + i * width + j).blue = 0; /(*(imageDataPtr + i * width +
11、j).green = 0; /(*(imageDataPtr + i * width + j).red = 0; fread(imageDataPtr, sizeof(struct tagIMAGEDATA) * width, height, fpi); fclose(fpi);t原文件读取完毕! return true;4.2 Huffman解压缩 Huffman树构造构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。void Haffm
12、an(int weight, HaffNode haffTree) int i, j, m1, m2, x1, x2; for (i = 0; i2 * MaxN - 1; i+) if (iMaxN) haffTreei.letter = (char)i; haffTreei.weight = weighti; haffTreei.flag = 0; haffTreei.parent = -1; haffTreei.leftChild = -1; haffTreei.rightChild = -1;MaxN - 1; m1 = m2 = MaxValue; x1 = x2 = 0; for
13、(j = 0; jMaxN + i; j+) if (haffTreej.weightm1&haffTreej.flag = 0) m2 = m1; x2 = x1; m1 = haffTreej.weight; x1 = j; else if (haffTreej.weightm2& m2 = haffTreej.weight; x2 = j; haffTreex1.parent = MaxN + i; haffTreex2.parent = MaxN + i; haffTreex1.flag = 1; haffTreex2.flag = 1; haffTreeMaxN + i.weight
14、 = haffTreex1.weight + haffTreex2.weight; haffTreeMaxN + i.leftChild = x1; haffTreeMaxN + i.rightChild = x2; Huffman编码解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中:void HaffmanEncode(HaffNode haffTree, ch
15、ar codeMaxNMaxN)/编码结果保存在2.txt文档中 char hcodeMaxN; int start, i, child, parent;MaxN; start = MaxN - 1; hcode-start = 0; child = i; parent = haffTreechild.parent; while (parent != -1) if (haffTreeparent.leftChild = child) hcode-start = 0 else hcode-start = 1 child = parent; parent = haffTreechild.paren
16、t; strcpy(codei, &hcodestart); Huffman译码void HaffmanDecode(HaffNode haffTree)/译码结果保存在5.txt文档中 FILE *fp1, *fp2; int i = 2 * MaxN - 2; char c; if (fp1 = fopen(学习资料信息安全基础实习ConsoleApplication1ConsoleApplication12.txt) = NULL) printf(Cannot Open The File! exit(1); if (fp2 = fopen(学习资料信息安全基础实习ConsoleAppli
17、cation1ConsoleApplication14.txtwb fscanf(fp1, %c, &c); do if (c = ) i = haffTreei.leftChild; else i = haffTreei.rightChild; if (haffTreei.leftChild = -1) fputc(haffTreei.letter, fp2); i = 2 * MaxN - 2; fscanf(fp1, while (c != fclose(fp1); fclose(fp2);4.3 线性分组码 线性分组码编码void Encode() int c13, c27; stri
18、ng str, b1; int i = 0; FILE *fp2, *fp3;r无法打开文件! if (fp3 = fopen(3.txtw while (!feof(fp2) fscanf(fp2, str);/将2.txt中二进制流写入str中 stri = int num = i; num-; num; b1i = stri; if (i % 3 = 0) c10 = stri - else if (i % 3 = 1) c11 = stri - else if (i % 3 = 2) c12 = stri - if (i + 1) % 3 = 0) c20 = c10; c21 = c
19、11; c22 = c12; c23 = c10 + c12; c24 = c10 + c11 + c12; c25 = c10 + c11; c26 = c11 + c12; for (int j = 0; 7; if (c2j = 2) c2j = 0; else if (c2j = 3) c2j = 1; fprintf(fp3, %d, c2j);/将线性分组码编码结果放在3.txt中 fclose(fp3); 线性分组码译码void Decoding() int G37=1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,1,1,0,1; int P34,Q43,HT
20、73,R27,C3; int R17; int H47=0,S4=0,E7=0; int i,j,n,k,t=0,w; FILE *fp1,*fp2; stringstr; int num; i=0; if(fp1=fopen(6.txt,)=NULL) printf( exit(1); if(fp2=fopen()=NULL) /将线性分组码的译码结果存入4.txt中 while(!feof(fp1) fscanf(fp1,&stri+); num=i; /printf(num=%d,num); for(i=0;i3;i+) for(j=3;j7;j+) Pij-3=Gij; for(j=0;4; Qji=Pij; Hij=Qij; j=3; Hii+j=1; HTji=Hij; for(w=0;wnum;w+) if(w%7=0) R10=strw- else if(w%7=1) R11=strw- else if(w%7=2) R12=strw- else if(w%7=3) R13=strw- else if(w%7=4) R14=strw- else if(w%7=5) R15=strw- else if(w%7=6) R16=strw- int S4=0; int E7=0; t=0; if(w+1)%7=0) for(i=0; for(j=0; Si=Si+R
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1