1. 程式人生 > 實用技巧 >第三課:檔案操作【逐步淺入,深入加解法】

第三課:檔案操作【逐步淺入,深入加解法】

先宣告,小編的程式碼全是自己跟著學習,摸索著前進的,沒什麼技術含量在內,要說什麼專業性術語,那不是為難小編嘛。

下面,逐步實現加解密的程式碼,請跟著小編往下看,多叨擾一句:一個一個字地看,因為小編也會跟著敲,哪裡出了錯誤,小編也會及時跟著解決。

前面說到,既然能寫入又能讀出了,那麼加、解密在哪?

下面就逐步剖析出小編的一套加密法,很簡單,也很直白,目的就是達到每寫入一個位元組後面加點字元,為了省事,小編就添加了隨機字母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] << "\t";
    }
    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] << "\t";
                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] = '\0';
    size2 = index;
    //方便檢視
    for (size_t i = 0; i < size2; i++)
    {
        cout << Buffer2[i] << "\t";
    }
    cout << endl;
    return 1;
}

執行後的結果就是,原有資料和加密字母,一連串的字元。