题目描述
现实中的网络通讯不够理想,经常会有bit从0变1,从1变0...为了检验是否出错 需要用到循环冗余校验CRC
CRC冗余检验码包含两个部分 k位信息位+n位校验位,可由以下的步骤得到:
1.将要传送的数据分段,每段k个bit,如果不足k位用0补齐
2.对于每个长度为k的01序列M, 先在M后面加n个0得到新的M‘.
3.选定一个(n+1)位的01序列做为除数P,对M‘做**模2的除法,得到一个n位的余数R(即校验位).
4.将R接到M的后面就得到了M的 CRC冗余检验码
请写一个程序模拟处理出CRC码的过程.
**注意此处模2的除法是不进位的除法,除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。如图所示
输入
多组样例输入,每个样例有3行. 第一行三个整数m,n,k.(m>0&&m<=200 n>0&&n<=100 m>=n k>0&&k<=100)
m要传送的比特串的长度 , n除数P的位数(实际的校验位长为n-1) , k 每个码元有 k 个比特
第二行 一个m位的字符串 即要传送的序列
第三行 一个n位的字符串 即除数P
输出
每行输出一段码元处理后的CRC码.见样例.
样例输入
15 4 6 101001101001101 1101
样例输出
Case: 1# 101001001 101001001 101000100
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 3000; int a[N], c[N], p[N]; char s[N]; int main() { int cas = 0; int n, m, k, K; while(~scanf("%d%d%d", &m, &n, &K)) { scanf("%s", s); for(int i = 0; s[i]; i++) { a[i] = s[i] - ‘0‘; } scanf("%s", s); for(int i = 0; s[i]; i++) { p[i] = s[i] - ‘0‘; } printf("Case: %d#\n", ++cas); for(int t = K - m % K; t > 0 && m % K; t--) { a[m++] = 0; } for(int i = 0; i < m; i += K) { for(int j = 0; j < K; j ++) { c[j] = a[i+j]; } for(int j = K; j < K + n - 1; j ++) { c[j] = 0; } for(int j = 0; j < K; j ++) { if(c[j] == 0) continue; for(int k = 0; k < n; k ++) { c[j+k] ^= p[k]; } } for(int j = 0; j < K; j ++) { printf("%d", a[i+j]); } for(int j = K; j < K+n-1; j++) { printf("%d", c[j]); } puts(""); } } return 0; }
XTU1200:ProblemCRC
时间: 2024-10-09 21:37:29