用于文件传输的C ++校验和算法

时间:2017-07-13 12:13:43

标签: c++ checksum

我被要求为文件传输创建校验和算法,我给出的C ++代码如下:

// ChecksumTestTool.cpp : Defines the entry point for the console 
application.
//

#include "stdafx.h"

#include <string>
#include <stdio.h>
#include <iostream>

unsigned long CalculateChecksum(FILE* pFile);

int main(int argc, char *argv[])
{
    int result = 0;
    //Get filename from command args
    std::string fileName;
    if (argc >= 1)
    {
        fileName = argv[0];
        //Open file with read access
        FILE* pFile = nullptr;
        int error = fopen_s(&pFile, fileName.c_str(), "r");
        if (error != 0 || pFile == nullptr)
        {
            printf("Failed to open file with error %d\r\n", error);
            result = -1;
        }
        else
        {
            //Calculate the checksum
            unsigned long checksum = CalculateChecksum(pFile);
            printf("Calculated Checksum for %s is %lu (0x%04X)\r\n", 
            fileName.c_str(), checksum, checksum);
        }
    }
    else
    {
        printf("Must enter filename on command line\r\n");
        result = -1;
    }

    //Wait here so we can see result
    printf("\r\nPress Any Key to Exit\r\n");
    getchar();
    return 0;
}

unsigned long CalculateChecksum(FILE* pFile)
{
unsigned long checksum = 0;
//TODO:: Calculate the checksum
return checksum;
}

我需要在'// TODO ::计算校验和'点创建校验和。该算法需要检查文件是否传输。 到目前为止,我已经尝试过:

unsigned long CalculateChecksum(FILE* pFile)
{
    unsigned long checksum = 0;
    //TODO:: Calculate the checksum
    unsigned long word = 0;
    while (file.read(reinterpret_cast<char*>(&word), sizeof(word))); {
    checksum += word;
    }

    if (file.gcount()); {
        word &= (~0U >> ((sizeof(unsigned long) - file.gcount()) * 8));
        checksum += word;
    }

    return checksum;
}

我得到的错误是'file'是一个未声明的标识符,而'.gcount'必须有class / struct / union

我搜索过多个校验和,这个算法是我发现的唯一可以在此代码中运行的算法

1 个答案:

答案 0 :(得分:1)

有些事情: 您将一个名为pFile的变量传递给函数,在您使用的函数file中。

您使用if(expression);,因此if后面的部分将始终执行,因为if()没有任何影响。

我甚至没有考虑校验和功能是否有效,但是当你做

if(term);
{
    // Do something
}

总会达到一些事情。它应该是

if (term)
{
   // Do something
}

所以只有在术语评估为真时才会这样做