gpt4 book ai didi

C 中的 CRC16 文件验证困惑

转载 作者:行者123 更新时间:2023-11-30 18:23:05 25 4
gpt4 key购买 nike

这里我想知道如何为任何类型的文件实现计算 CRC16,

在这里我了解了 CRC16 及其代码逻辑。这里我做了一个函数,它将文件路径作为输入并找出它的 CRC 值。这里我在这个函数中传递文件名,这个函数计算这个文件的 CRC 值。但我想计算所有类型的文件,例如 .tar、.tar.gz、.txt、.bin、.scr 等

所以在这里我打开所有文件和“rb”模式并逐一获取字符并找出CRC值它的方法正确吗?也许我在这方面遗漏了一些东西。它适用于 .txt 和所有其他文件,但会在 .tar、.tar.gz 类型文件中产生问题。因为这里我有一个 890 MB 的文件,其名称为 file.tar.gz ,它需要 203 微秒,我还有其他文件它的大小是 382 MB,其名称是 file2.tar 其耗时 6097850.000000 微秒 对我来说难以置信,这怎么可能?

我的问题是这些

1 Some thing problem in my CRC code ?

2 Problem in reading file data style, may be i am reading file data in wrong manner for .tar.gz.

这是我的代码:

int CRC16(const char* filePath) {
//Declare variable to store CRC result.
unsigned short result;
//Declare loop variables.
int intOuterLoopIndex, intInnerLoopIndex, nLen;
result = 0xffff; //initialize result variable to perform CRC checksum calculation.

//Store message which read from file.
//char content[2000000];

//Create file pointer to open and read file.
FILE *readFile;

//Use to read character from file.
char readChar;

//open a file for Reading
readFile = fopen(filePath, "rb");

//Checking file is able to open or exists.
if (!readFile) {
fputs("Unable to open file %s", stderr);
}

/*
Here reading file and store into variable.
*/
int chCnt = 0;
while ((readChar = getc(readFile)) != EOF) {
result ^= (short) (readChar);
for (intInnerLoopIndex = 0; intInnerLoopIndex < 8; intInnerLoopIndex++) {
if ((result & 0x0001) == 0x0001) {
result = result >> 1; //Perform bit shifting.
result = result ^ 0xa001; //Perform XOR operation on result.
} else {
result = result >> 1; //Perform bit shifting.
}
}

//content[chCnt] = readChar;
chCnt++;
}
printf("CRC data length in file: %d", chCnt);

return (result);
}

最佳答案

char readChar;错误,需要是int readChar;

getc () 返回一个 int,因此它可以向您发出 EOF 信号。 EOF 的值可能是 -1

如果将返回值转换为 char,并读取值为 255 的字节,则 255 将被解释为 -1,并且在第一个值为 255 的字节处停止读取。

关于C 中的 CRC16 文件验证困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com