- 使用背景
- 程序功能
- 获取外部参数并遍历执行
- 去除路径最外部的双引号
- 计算文件长度
- 计算文件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
嵌入式算法7:CRC校验算法 ↩︎
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)