IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言编写计算文件CRC的小程序 -> 正文阅读

[C++知识库]C语言编写计算文件CRC的小程序

使用背景

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

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

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

#include <stdio.h>

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:31:44  更:2022-05-25 11:31:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 2:02:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码