第三課:檔案操作【逐步淺入,深入加解法】
阿新 • • 發佈:2020-10-07
先宣告,小編的程式碼全是自己跟著學習,摸索著前進的,沒什麼技術含量在內,要說什麼專業性術語,那不是為難小編嘛。
下面,逐步實現加解密的程式碼,請跟著小編往下看,多叨擾一句:一個一個字地看,因為小編也會跟著敲,哪裡出了錯誤,小編也會及時跟著解決。
前面說到,既然能寫入又能讀出了,那麼加、解密在哪?
下面就逐步剖析出小編的一套加密法,很簡單,也很直白,目的就是達到每寫入一個位元組後面加點字元,為了省事,小編就添加了隨機字母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; }
執行後的結果就是,原有資料和加密字母,一連串的字元。