- 使用背景
- 程序功能
- 获取外部参数并遍历执行
- 去除路径最外部的双引号
- 计算文件长度
- 计算文件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
嵌入式算法7:CRC校验算法 ↩︎



