📄 encode.c
字号:
/* ENCODE.C - Encode message blocks. *//* Copyright (c) 2000, 2001 by Radford M. Neal * * Permission is granted for anyone to copy, use, modify, or distribute this * program and accompanying programs and documents for any purpose, provided * this copyright notice is retained and prominently displayed, along with * a note saying that the original programs are available from Radford Neal's * web page, and note is made of any changes made to the programs. The * programs and documents are distributed without any warranty, express or * implied. As the programs were written for research purposes only, they have * not been tested to the degree that would be advisable in any important * application. All use of these programs is entirely at the user's own risk. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "rand.h"#include "alloc.h"#include "blockio.h"#include "open.h"#include "mod2sparse.h"#include "mod2dense.h"#include "mod2convert.h"#include "rcode.h"#include "enc.h"void usage(void);/* MAIN PROGRAM. */int main( int argc, char **argv){ char *source_file, *encoded_file; char *pchk_file, *gen_file; mod2dense *u, *v; FILE *srcf, *encf; char *sblk, *cblk, *chks; int i, n; /* Look at arguments. */ if (!(pchk_file = argv[1]) || !(gen_file = argv[2]) || !(source_file = argv[3]) || !(encoded_file = argv[4]) || argv[5]) { usage(); } if ((strcmp(pchk_file,"-")==0) + (strcmp(gen_file,"-")==0) + (strcmp(source_file,"-")==0) > 1) { fprintf(stderr,"Can't read more than one stream from standard input\n"); exit(1); } /* Read parity check file */ read_pchk(pchk_file); if (N<=M) { fprintf(stderr, "Can't encode if number of bits (%d) not greater than number of checks (%d)\n", N,M); exit(1); } /* Read generator matrix file. */ read_gen(gen_file,0,0); /* Allocate needed space. */ if (type=='d') { u = mod2dense_allocate(N-M,1); v = mod2dense_allocate(M,1); } if (type=='m') { u = mod2dense_allocate(M,1); v = mod2dense_allocate(M,1); } /* Open source file. */ srcf = open_file_std(source_file,"r"); if (srcf==NULL) { fprintf(stderr,"Can't open source file: %s\n",source_file); exit(1); } /* Create encoded output file. */ encf = open_file_std(encoded_file,"w"); if (encf==NULL) { fprintf(stderr,"Can't create file for encoded data: %s\n",encoded_file); exit(1); } sblk = chk_alloc (N-M, sizeof *sblk); cblk = chk_alloc (N, sizeof *cblk); chks = chk_alloc (M, sizeof *chks); /* Encode successive blocks. */ for (n = 0; ; n++) { /* Read block from source file. */ if (blockio_read(srcf,sblk,N-M)==EOF) { break; } /* Compute encoded block. */ switch (type) { case 's': { sparse_encode (sblk, cblk); break; } case 'd': { dense_encode (sblk, cblk, u, v); break; } case 'm': { mixed_encode (sblk, cblk, u, v); break; } } /* Check that encoded block is a code word. */ mod2sparse_mulvec (H, cblk, chks); for (i = 0; i<M; i++) { if (chks[i]==1) { fprintf(stderr,"Output block %d is not a code word! (Fails check %d)\n",n,i); abort(); } } /* Write encoded block to encoded output file. */ blockio_write(encf,cblk,N); } fprintf(stderr, "Encoded %d blocks, source block size %d, encoded block size %d\n",n,N-M,N); if (ferror(encf) || fclose(encf)!=0) { fprintf(stderr,"Error writing encoded blocks to %s\n",encoded_file); exit(1); } return 0;}/* PRINT USAGE MESSAGE AND EXIT. */void usage(void){ fprintf(stderr, "Usage: encode pchk-file gen-file source-file encoded-file\n"); exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -