写一个C语言的程序设计,要求是进行CRC校验,校验多项式采用CRC-16,输入的数据不定长,输入数据流放入TXT文件中,输出放在同一文件的最后一行,输入数据中最后2个字节为校验码,采用小端格式,要求可以计算0x00~0xff的CRC校验码表
时间: 2024-05-02 16:23:29 浏览: 149
以下是一个实现CRC-16校验的C语言程序设计:
```c
#include <stdio.h>
#include <stdlib.h>
#define CRC16_POLY 0xA001 // CRC-16多项式
#define BUF_SIZE 1024 // 缓冲区大小
// 生成CRC校验码表
void generate_crc_table(unsigned short crc_table[]) {
unsigned short crc;
int i, j;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ CRC16_POLY;
} else {
crc >>= 1;
}
}
crc_table[i] = crc;
}
}
// 计算CRC校验码
unsigned short calc_crc(unsigned short crc_table[], unsigned char *data, int len) {
unsigned short crc = 0;
int i;
for (i = 0; i < len; i++) {
crc = (crc >> 8) ^ crc_table[(crc & 0xFF) ^ data[i]];
}
return crc;
}
int main() {
unsigned short crc_table[256];
char *filename = "data.txt";
FILE *fp = fopen(filename, "rb");
if (!fp) {
printf("Failed to open file %s\n", filename);
return 1;
}
// 生成CRC校验码表
generate_crc_table(crc_table);
// 读取文件内容
unsigned char buf[BUF_SIZE];
int len = 0, total_len = 0;
while ((len = fread(buf, 1, BUF_SIZE, fp)) > 0) {
total_len += len;
}
fclose(fp);
// 计算CRC校验码
unsigned short crc = calc_crc(crc_table, buf, total_len - 2);
// 将CRC校验码写入文件末尾
fp = fopen(filename, "ab");
if (!fp) {
printf("Failed to open file %s\n", filename);
return 1;
}
fwrite(&crc, 2, 1, fp);
fclose(fp);
return 0;
}
```
该程序首先生成CRC-16校验码表,然后读取文件内容并计算CRC校验码,最后将校验码写入文件末尾。在计算CRC校验码时,程序会将最后两个字节忽略,因为这两个字节是校验码本身。在写入校验码时,程序采用了"ab"模式打开文件以追加方式写入数据。
注意,程序中用到的CRC-16多项式为0xA001,这是一种常用的CRC-16多项式。如果需要使用其他的CRC-16多项式,可以将该多项式替换为其他多项式。
阅读全文