第三课:文件操作【逐步浅入,深入加解法】

先声明,小编的代码全是自己跟着学习,摸索着前进的,没什么技术含量在内,要说什么专业性术语,那不是为难小编嘛。

下面,逐步实现加解密的代码,请跟着小编往下看,多叨扰一句:一个一个字地看,因为小编也会跟着敲,哪里出了错误,小编也会及时跟着解决。

前面说到,既然能写入又能读出了,那么加、解密在哪?

下面就逐步剖析出小编的一套加密法,很简单,也很直白,目的就是达到每写入一个字节后面加点字符,为了省事,小编就添加了随机字母A-Z。

那么如何实现呢,因为考虑到某方面,加一个字节数据不保险,小编就多添加点,这里呢,添加三个。

//加密函数
int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2);
//解密函数
int DesEnc_raw(char* Buffer, size_t* size, char* Buffer2, size_t& size2);

因为我们前面用char类型来保存数据的,这里我们还是用char类型,防止其他类型在转换时,数据或多或少地被遗漏掉。

当我们在读出后,从意义上看,已经有了数据,往后不用想就是加密函数了。

当然了,首看加密和解密函数很粗糙,难以理解,这里也不用理解太深,只要知道参数1:传入的数据,参数2:传入数据的字节数,参数3:加密后带出的数据,参数4:带出数据的字节数,即可。

//声明加密后的字符串变量和字节存储的变量
char *addPassName = NULL; size_t addPassLength = 0;

既然有了这两个变量,就可以带出数据和数据字节数。

参数1:我们不知道数据大小,但编译器却是知道的,我们在fread()时,就已经读出来了。

参数2:fread()函数的返回值

参数3:考虑到addPassName已经为空,就不能直接带入,分配假设需要的内存空间。

参数4:就是addPassLength,用索引符,就是为了从加密函数中带出来

    //读出、写入文件
    while ((ret = feof(f_Read)) != EOF)
    {
        //读出文件,因为我们假设不知道文件所写的是什么内容,文件又不大的话,可以先设定为256
        //当然sizeof(stringname)也行
        readLength = fread((char*)stringname, 1,sizeof(stringname), f_Read);
//申请内存空间      addPassName=(char *)malloc(sizeof(char)*256);
//加密 int ret = DesEnc(stringname, &readLength, addPassName, addPassLength); //当读取完毕,结束继续读,feof()这个函数会读取2次 if (ret == feof(f_Read)) { system("pause"); break; } }

下面就可以写加密函数了。

int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2)
{
    int sizeNumber = *size;
    cout <<"带入的数据字节:"<< sizeNumber << endl;
    
    int ret = -1;
    //判断带入的数据是否存在
    if (Buffer == NULL || sizeNumber == 0)
    {
        cout << "数据为空,或者字节为0" << endl;
        system("pause");
        return ret;
    }
    
    //方便查看
    for (size_t i = 0 ;i<sizeNumber ;i++)
    {
        cout << Buffer[i] << "	";
    }
    cout << endl;
    return 1;
}

输出的结果就是,所带入的数据字节和数据。

为了防止出现错误,也可以在加密函数后面添加判断,-1,调用失败,否,则调用成功。

int ret = DesEnc(stringname, &readLength, addPassName, addPassLength);
if (ret == -1)
{
   cout << "error" << endl;
}
else
{
   cout << "加密ok" << endl;
}

数据既然有了,那么就可以加密了。

int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2)
{
    int sizeNumber = *size;
    cout <<"带入的数据字节:"<< sizeNumber << endl;
    
    int ret = -1;
    //判断带入的数据是否存在
    if (Buffer == NULL || sizeNumber == 0)
    {
        cout << "数据为空,或者字节为0" << endl;
        system("pause");
        return ret;
    }
    
    
    int j = 0;                    //作为cpytemp临时存储数据的位置
    int index = 0;                //用来存储cpytemp存储的次数,也就是加密后的字节数
    char* bufftemp = NULL;        //存储每个字符以及加密后的数据
    bufftemp = new char[sizeNumber*4];
    int l = 0;                    //作为bufftemp的下标(位置)
    for (size_t i = 0;i<sizeNumber ;i++)
    {
        //用一个数组临时存储数据,也为了方便可以赋值给bufftemp
        char cpybuff[4] = {0};
        if (j == 0)
        {
            cpybuff[j] = Buffer[i];            //存储了第一个字节
            index += 1;
            //因为说添加三个随机加密A-Z字母,就添加三个
            for (size_t k =j+1;k<4;k++)
            {
                char c[1] = {0};
                c[0] = rand() % 26 + 65;
                cpybuff[k] = c[0];
                //cout << cpytemp[k] << "	";
                index += 1;
                j++;
            }
            //将每i次循环后,i位置上的字符和加密后的字符都带入bufftemp
            for (size_t k=0;k<4;k++)
            {
                bufftemp[l] = cpybuff[k];
                l++;
            }
            j =0;    //j==0,就是为了让cpybuff每次都能从0的位置带入数据
        }
    }
    


    //这样就能将原有数据+加密后的数据全部带入Buffer2中,带出函数体
    for (size_t i = 0; i < index; i++)
    {
        *(Buffer2 + i) = bufftemp[i];
    }
    Buffer2[index] = '';
    size2 = index;
    //方便查看
    for (size_t i = 0; i < size2; i++)
    {
        cout << Buffer2[i] << "	";
    }
    cout << endl;
    return 1;
}

运行后的结果就是,原有数据和加密字母,一连串的字符。

条条英符铸平凡,行行代码显乾坤;
原文地址:https://www.cnblogs.com/VisiousDragon/p/13778540.html