CRC校验程序设计要求 1、校验多项式采用:CRC-16; 2、输入数据流不定长,输入数据流放入txt文件中;输出存入到同一文件的下一行,后面2字节为校验码,采用小端格式; 3、画出程序流程图; 4、计算0x00-0xff的CRC校验码表;c语言实现
时间: 2024-05-16 09:13:57 浏览: 173
以下一个CRC校验程序的C语言实现,采用CRC-16校验多项式,输入数据流从txt文件中读入,输出存入到同一文件的下一行,后面2字节为校验码,采用小端格式。
程序流程图可以根据以下代码自行绘制:
```c
#include <stdio.h>
#include <stdlib.h>
#define CRC16_POLY 0x8005 // CRC-16多项式
// 计算CRC-16校验码表
void crc16_table(unsigned short *table)
{
int i, j;
unsigned short crc;
for (i = 0; i < 256; i++) {
crc = i << 8;
for (j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ CRC16_POLY;
} else {
crc <<= 1;
}
}
table[i] = crc;
}
}
// 计算CRC-16校验码
unsigned short crc16(unsigned char *data, int len, unsigned short *table)
{
int i;
unsigned short crc = 0xFFFF;
for (i = 0; i < len; i++) {
crc = (crc << 8) ^ table[((crc >> 8) ^ data[i]) & 0xFF];
}
return crc;
}
int main()
{
FILE *fp_in, *fp_out;
unsigned char *data;
unsigned short *table;
unsigned short crc;
int len, i;
// 打开输入文件
fp_in = fopen("input.txt", "rb");
if (fp_in == NULL) {
printf("Error opening input file.\n");
return 1;
}
// 打开输出文件
fp_out = fopen("output.txt", "ab");
if (fp_out == NULL) {
printf("Error opening output file.\n");
return 1;
}
// 计算CRC-16校验码表
table = (unsigned short *)malloc(sizeof(unsigned short) * 256);
crc16_table(table);
// 读入数据流并计算CRC-16校验码
while (!feof(fp_in)) {
// 读入数据流
data = (unsigned char *)malloc(sizeof(unsigned char) * 1024);
len = fread(data, 1, 1024, fp_in);
// 计算CRC-16校验码
crc = crc16(data, len, table);
// 输出数据流和CRC-16校验码
fwrite(data, 1, len, fp_out);
fwrite(&crc, 1, 2, fp_out);
free(data);
}
free(table);
fclose(fp_in);
fclose(fp_out);
return 0;
}
```
阅读全文