写一个CRC校验的c语言程序
时间: 2023-09-10 15:04:47 浏览: 153
### 回答1:
下面是一个简单的CRC校验的c语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define WIDTH (8 * sizeof(uint32_t))
#define TOPBIT (1 << (WIDTH - 1))
#define POLYNOMIAL 0x04C11DB7
uint32_t crc32(uint32_t remainder, unsigned char *message, size_t nBytes) {
uint32_t byte, mask;
for (size_t i = 0; i < nBytes; i++) {
byte = message[i];
remainder ^= (byte << (WIDTH - 8));
for (uint8_t bit = 8; bit > 0; bit--) {
if (remainder & TOPBIT) {
remainder = (remainder << 1) ^ POLYNOMIAL;
} else {
remainder = (remainder << 1);
}
}
}
return remainder;
}
int main(void) {
unsigned char message[] = "123456789";
size_t nBytes = sizeof(message) - 1;
uint32_t remainder = crc32(0, message, nBytes);
printf("CRC-32: 0x%" PRIx32 "\n", remainder);
return 0;
}
```
这是一个简单的CRC校验代码,它通过对一个字符串的每一个字节进行校验,并对校验结果进行计算。这个代码使用了32位的CRC校验算法。你可以根据自己的需要调整代码。
### 回答2:
以下是一个基于C语言的CRC校验程序示例:
```c
#include<stdio.h>
#include<string.h>
// CRC校验函数
unsigned int crc16(char *data, int length)
{
unsigned int crc = 0xFFFF; // 初始化CRC值
for (int i = 0; i < length; i++)
{
crc ^= (unsigned int)data[i]; // 使用当前字节和CRC值异或
for (int j = 0; j < 8; j++)
{
if (crc & 0x0001) // 判断最低位是否为1
{
crc >>= 1; // 向右移位
crc ^= 0xA001; // 使用预设的CRC多项式异或
}
else
{
crc >>= 1; // 向右移位
}
}
}
return crc;
}
int main()
{
char data[] = "Hello, World!"; // 要校验的数据
int length = strlen(data); // 数据长度
unsigned int result = crc16(data, length); // 调用CRC校验函数
printf("CRC校验结果: 0x%04X\n", result);
return 0;
}
```
上述程序用于计算给定数据的CRC校验结果。其中`crc16`函数接受一个字符数组(即要校验的数据)和数据长度作为输入,返回一个无符号整数表示计算得到的CRC校验结果。`main`函数中通过在`data`中存储要校验的数据,计算CRC值,并将结果打印输出。
请注意,此示例仅用于演示CRC校验的原理和基本实现,并未考虑细节问题(例如字节序、部分参数的灵活性等),在实际应用中,可能需要进行一些调整和优化。
### 回答3:
下面是一个使用C语言编写的CRC校验程序的示例代码:
```c
#include <stdio.h>
#define POLYNOMIAL 0xEDB88320L // CRC32多项式
#define BUFFER_SIZE 1024
unsigned long crc_table[256];
void generate_crc_table() {
unsigned long crc;
int i, j;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
crc = (crc >> 1) ^ ((crc & 1) ? POLYNOMIAL : 0);
}
crc_table[i] = crc;
}
}
unsigned long calculate_crc(char *buffer, int length) {
unsigned long crc = 0xFFFFFFFFL;
int i;
for (i = 0; i < length; i++) {
crc = (crc >> 8) ^ crc_table[(crc ^ buffer[i]) & 0xFF];
}
return crc ^ 0xFFFFFFFFL;
}
int main() {
char buffer[BUFFER_SIZE];
int length;
unsigned long crc;
generate_crc_table();
printf("请输入要进行CRC校验的字符串:");
fgets(buffer, BUFFER_SIZE, stdin);
length = strlen(buffer) - 1; // 减去换行符
crc = calculate_crc(buffer, length);
printf("CRC校验结果为:%lx\n", crc);
return 0;
}
```
这个程序首先定义了CRC32多项式常量和缓冲区大小常量。然后,在`generate_crc_table`函数中,使用CRC32多项式生成一个CRC表。接下来,`calculate_crc`函数根据给定的缓冲区和长度计算CRC。最后,在主函数中,通过`fgets`函数获取用户输入的字符串,并调用`calculate_crc`函数计算CRC校验结果,并将结果输出到屏幕上。
注意,这只是一个简单的CRC校验程序示例,实际应用中可能需要根据具体需求进行修改和扩展。
阅读全文