校验和,数据完整性

Checksums, Data Integrity

本文关键字:数据完整性 校验和      更新时间:2023-10-16

此赋值的伪代码本质上是:1.以二进制模式打开指定的文件2.将文件名保存在fileNames数组中。3.使用seekg和tellg确定文件大小4.在一条语句中将文件内容读取到字符数组中5.关闭文件6.循环遍历数组,每次一个字符,并累加每个字节的总和7.将总和存储到checkSums数组中。

#include <iostream>
#include <string>
#include <iomanip>
 #include <fstream>
#include <cstring>
using namespace std;

int main()
{
//declare variables
string filePath;
void savefile();
char choice;
int i, a, b, sum;
sum = 0;
a = 0;
b = 0;
ifstream inFile;
//arrays
const int SUM_ARR_SZ = 100;
string fileNames[SUM_ARR_SZ];
unsigned int checkSums[SUM_ARR_SZ];
do {
    cout << "Please select: " << endl;
    cout << "   A) Compute checksum of specified file" << endl;
    cout << "   B) Verify integrity of specified file" << endl;
    cout << "   Q) Quit" << endl;
    cin >> choice;
    if (choice == 'a' || choice == 'A')
    {
        //open file in binary mode
        cout << "Specify the file path: " << endl;
        cin >> filePath;
        inFile.open(filePath.c_str(), ios::binary);
        //save file name
        fileNames[a] = filePath;
        a++;

        //use seekg and tellg to determine file size
        char Arr[100000];
        inFile.seekg(0, ios_base::end);
        int fileLen = inFile.tellg();
        inFile.seekg(0, ios_base::beg);
        inFile.read(Arr, fileLen);
        inFile.close();
        for (i = 0; i < 100000; i++)
        {
            sum += Arr[i];
        }
        //store the sum into checkSums array
        checkSums[b] = sum;
        b++;
        cout << "    File checksum = " << sum << endl;
    }
    if (choice == 'b' || choice == 'B')
    {
        cout << "Specify the file path: " << endl;
        cin >> filePath;
        if (strcmp(filePath.c_str(), fileNames[a].c_str()) == 0)
        {
        }
    }
} while (choice != 'q' && choice != 'Q');
system("pause");
}

我得到的值是"-540000",我不知道如何解决这个问题。非常感谢您的帮助!

  1. 您正在堆栈上创建一个数组,而不将其内容清零,因此Arr将包含"垃圾"数据
  2. 您正在创建具有固定大小的缓冲区,这意味着如果文件小于100000字节,并且无法处理大于100000字节的文件(如果不重用缓冲区),则会浪费空间
  3. 如果文件小于100000字节,则迭代缓冲区中的每个字节,而不是代表文件的那些字节
  4. 我还注意到您正在混合使用C和C++字符串函数。如果使用string,则不需要调用C的strcmp,然后使用string::compare
  5. C++不需要局部变量的前向声明,如果在使用局部变量时只声明局部变量,而不是一次声明所有变量,那么代码会更干净