栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录
  • 使用背景
  • 程序功能
    • 获取外部参数并遍历执行
    • 去除路径最外部的双引号
    • 计算文件长度
    • 计算文件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.nn");
		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:   %sn", basename);
	printf("File length: 0x%04Xn", length);
	printf("File byte:   0x%04Xn", data[0]);
	printf("File CRC:    0x%04Xn", result);
	printf("n");
}

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

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

	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校验算法 ↩︎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号