C语言编写计算文件CRC的小程序

C语言编写计算文件CRC的小程序,第1张

目录
  • 使用背景
  • 程序功能
    • 获取外部参数并遍历执行
    • 去除路径最外部的双引号
    • 计算文件长度
    • 计算文件CRC值
    • 获取路径中的文件全名
  • 程序下载

使用背景

由于工作需要计算一个文件的CRC,这种软件当然早就有人写过,但是手边的电脑上刚好没有,于是顺手现写了一个。

程序比较简单,最近正好了解到C语言的程序main函数可以通过argc*argv传递外部参数。实践了一下,结合成了一个实用小程序。

程序比较简单,直接发代码了:

#include 

unsigned short Cal_CRC(char *data, int length)
{
	char i;
	char tmp;
	unsigned short CRC = 0x0000;

	while (length--)
	{
		tmp = *(data++);
		CRC ^= tmp << 8;
		for (i = 0; i < 8; i++)
		{
			if (CRC & 0x8000)
				CRC = (CRC << 1) ^ 0x1021;
			else
				CRC = CRC << 1;
		}
	}
	return	CRC;
}

void file_name(const char* path, char* basename)
{
	int i;
	int pos = 0;
	for (i = 0; path[i]; i++)
	{
		if (path[i] == '/' || path[i] == '\')
			pos = i + 1;
	}
	strcpy(basename, path + pos);
}

void file_crc(char* path)
{
	FILE *fp;
	int length;
	int result;
	char basename[256];
	
	if (path[0] == '"')
		path[strlen(++path) - 1] = 0;

	fp = fopen(path, "rb");
	if (fp == NULL)
	{
		printf("file can not read.\n\n");
		fclose(fp);
		return;
	}

	fseek(fp, 0, SEEK_END);
	length = ftell(fp);
	fseek(fp, 0, SEEK_SET);

	char data[length];
	fread(data, length, 1, fp);
	result = Cal_CRC(data, length);
	fclose(fp);

	file_name(path, basename);
	printf("File name:   %s\n", basename);
	printf("File length: 0x%04X\n", length);
	printf("File byte:   0x%04X\n", data[0]);
	printf("File CRC:    0x%04X\n", result);
	printf("\n");
}

int main(int argc, char *argv[])
{
	int i;
	char path[1024];

	printf("File CRC Calc:\n(by lsx @ 20220520)\n\n");

	for (i = 1; i < argc; i++)
	{
		file_crc(argv[i]);
	}
	while (1)
	{
		printf("Input path: ");
		scanf("%s", path);
		file_crc(path);
	}
	return 0;
}
程序功能

其中实现了一些实用的小功能,其中包括:

获取外部参数并遍历执行
for (i = 1; i < argc; i++)
	func(argv[i]);
去除路径最外部的双引号
if (path[0] == '"')
	path[strlen(++path) - 1] = 0;
计算文件长度
fseek(fp, 0, SEEK_END);
length = ftell(fp);
fseek(fp, 0, SEEK_SET);
计算文件CRC值

这里用的是CRC-16/XMODEM算法1

unsigned short Cal_CRC(char *data, int length)
{
	char i;
	char tmp;
	unsigned short CRC = 0x0000;

	while (length--)
	{
		tmp = *(data++);
		CRC ^= tmp << 8;
		for (i = 0; i < 8; i++)
		{
			if (CRC & 0x8000)
				CRC = (CRC << 1) ^ 0x1021;
			else
				CRC = CRC << 1;
		}
	}
	return	CRC;
}
获取路径中的文件全名
void file_name(const char* path, char* basename)
{
	int i;
	int pos = 0;
	for (i = 0; path[i]; i++)
	{
		if (path[i] == '/' || path[i] == '\')
			pos = i + 1;
	}
	strcpy(basename, path + pos);
}
程序下载

*** 作效果展示,支持拖拽到程序图标打开、拖拽到程序窗口打开、输入路径打开:

拖拽文件到程序上,程序即可带参数启动,或在程序内输入路径运行。

自动打印每一个文件的文件名、文件长度、文件首字节数值、文件CRC值。

下载地址:https://download.csdn.net/download/weixin_39804265/85424921


  1. 嵌入式算法7:CRC校验算法 ↩︎

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存