Base64 編碼語解碼,其實是站長指派的「物件導性程式語言」的小組作業,至於為什麼要出編解碼,是因為站長很喜歡編碼與解碼的題目,算是喜歡玩含有邏輯概念的題目吧,聽說隔壁班有出到 RSA 加密,站長就沒研究了,藉口是沒時間,實際上是懶得再去碰程式了,然後由於久久沒發文,今天拿之前寫的 Base64 編解碼程式來衝一下文章數。
目錄
Base64
先來簡單了解一下什麼是 Base64 編碼與解碼,首先英文數字各別經過 ASCII 翻譯成機械碼,會是 8 bit,而 Base64 則是使用 6 bit,而 Base64 與 ASCII 使用的字元列表各有不同。
編碼表可以參考維基百科:https://zh.wikipedia.org/wiki/Base64
有不足的地方則用”=”,來補,一個”=”代表 2 bit 的 0,也就是說 “M” 的 Base64 就會等於 “TQ==”,過程也就是將 M 先解成機械碼 “01001101”,再將他切成 6 bit 為一組 “010011 | 01” ,後面第二組只有 01 不為 6bit ,所以則補 0,為 “010011 | 010000” 接著透過 Base64 的編碼來表示就會為 TQ,由於後方有捕兩組 00,所以需要補上兩組 “==”,M 的 BASE64 編碼為 TQ==。
CODE
#include <iostream>
#define CODE "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#define EZ 63
using namespace std;
char E = NULL;
char D;
int out;
void Decode(char i, char x){
if (x == 1){
D = (i << 2);
}else if (x == 2){
cout << char(D | (i >> 4));
D = (i << 4);
}else if (x == 3){
cout << char(D | (i >> 2));
D = (i << 6);
}else if (x == 4){
cout << char(D | i);
}
}
char Encode(char i,char x){
if (x == 1){
out = (i >> 2) | E;
E = (i << 4) & EZ;
return out ;
}else if(x == 2){
out = (i >> 4) | E;
E = (i << 2) & EZ;
return out;
}else if (x == 3){
out = (i >> 6) | E;
E = i & EZ;
return out;
}
}
int main(){
int i, x = 1;
int key;
char* in = new char[1000];
cout << "Base64 Decode & Encode" << endl;
cout << "1. Decode" << endl;
cout << "2. Encode" << endl;
cout << "Please select:"; cin >> key;
cout << "====================" << endl;
cout << "input:" << endl;
cin.get();
cin.getline(in, 1000);
cout << endl;
switch (key){
case 1:
cout << "Result:" << endl;
for (i = 0; in[i] != NULL; i++, x++){
for (int j = 0; j <= EZ; j++){
if ((char)in[i] == (char)CODE[j]){
Decode(j, x);
if (x == 4) x = 0;
}
}
}
if (x != 1){
for (int j = 1; j <= 3; j++){
if (x == 2 * j) cout << (D << 2 * j);
}
}
break;
case 2:
cout << "Base64:" << endl;
for (i = 0; in[i] != NULL; i++, x++){
cout << CODE[Encode(in[i], x)];
if (x == 3) {
x = 0;
cout << CODE[E];
E = NULL;
};
}
if (x != 1){
cout << CODE[E];
if (i * 8 % 6 == 2)cout << "==";
else if (i * 8 % 6 == 4)cout << "=";
}
break;
default:
cout << "Input Error!!";
system("pause");
return 1;
}
delete in;
return 0;
}
程式解說
先定義編碼表,透過變數 “key” 來選擇要編碼還是解碼,然後編解碼的部分運用全域變數來暫存溢位的部分,編碼部分需而外計算補多少 0 來補 “=”,解碼部分則可以忽略 “=”。
執行畫面
編碼畫面:
解碼畫面:
簡易心得
題目出完之後,其實也就開始上 Google、wiki,查詢想要的資訊,主要也是因為這一個題目在網路上較少開放 Code 讓人 copy,大學生作業就是會操來操去的,有一點為班上的人擔憂,以上是題外話,然後接著大約花了半天的時間完成這道題目,其實不難,至於我的 Code 方式,說實在的不是最優的,但至少可以解決這一題的問題,然後在寫程式的過程中,其實也有發現一些不影響的 Bug,但當時只想著快點出題目,然後就衝著去找 TA 了,結果回來後連改都沒改,直接攤著打 LOL :”P。

