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


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

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

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

    下面就逐步剖析出小编的一套加密法,很简单,也很直白,目的就是达到每写入一个字节后面加点字符,为了省事,小编就添加了随机字母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;
    }

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

    条条英符铸平凡,行行代码显乾坤;
  • 相关阅读:
    jquery 图片播放器插件(支持自己设定时间,自己设定是否自动播放)
    ie6下bug集合(二)li之间空隙bug
    大小不固定的图片和多行文字的垂直水平居中
    解决IE6下 position的fixed定位问题
    C# 编写不安全代码
    委托和事件的使用
    如何删除win7桌面的库和家庭组图标
    gcc g++ 区别
    Java 访问注册表
    C# 通过反射类动态调用DLL方法
  • 原文地址:https://www.cnblogs.com/VisiousDragon/p/13778540.html
Copyright © 2020-2023  润新知