# 12784 - Base64 Encoding > author: Rhino ###### tags: --- ## brief 注意 - std::string這種class是使用[HW11420 - Implement a vector 1](https://hackmd.io/VIWV35nVQZmJj2UOVqn6gg?view)所模擬的size和capacity來動態維護object。 - 所以只能寫成==temp_1_str **<<** ???== 或者==temp_1_str = temp_1_str **+** ???==,而不能用==temp_1_str[!!**錯誤**!!]==,因為會戳到不對的記憶體位置。 ## Solution 0 ```cpp #include "function.h" #include <string> #include <cstring> void Base64Codec::encode() { encoded = true; int original_str_len = code_str.length();//數ㄕㄨˇ字元個數。Mano = 4。 int original_str_len_backup = original_str_len;//備份 original_str_len *= 8;//轉換成binary後的數字個數,如果是Mano,original_str_len = 32,但original_str_len_backup=4。 int remainder = original_str_len % 6;//如果是32,會餘2,所以要補6-2=4個零。 int num_of_0_to_add = remainder == 0 ? 0 : (6 - remainder);//把要補"4"個零的"4"存起來 std::string temp_1_str; for (int i = 0; i < original_str_len_backup; i++) { int now_char_in_dec = (int)code_str[i];//如果code_str[0]=M,就把77存進裡面 for (int j = 7; j >= 0; j--) temp_1_str = temp_1_str + std::to_string((now_char_in_dec & 1 << j) != 0 ? 1 : 0);//to_string: 把數字轉換成char。// } for (int i = 0; i < num_of_0_to_add; i++) temp_1_str = temp_1_str + std::to_string(0); std::string temp_2_str; int count_group = (original_str_len + num_of_0_to_add) / 6; for (int i = 0; i < count_group; i++) { int this_group_in_dec = 0; for (int j = i * 6; j < (i + 1) * 6; j++) { this_group_in_dec = this_group_in_dec << 1; this_group_in_dec += temp_1_str[j] - '0'; } temp_2_str = temp_2_str + encodeCharacter(this_group_in_dec); } for (int i = 0; i < num_of_0_to_add / 2; i++) temp_2_str = temp_2_str + '='; code_str = temp_2_str; } // By Rhino ``` ## Solution 1 ```cpp #include "function.h" #include <sstream> void Base64Codec::encode() { stringstream st(code_str); int state = 0; char prev = 0; char ch = 0; code_str.clear(); while (!st.get(ch).eof()) { code_str.push_back(encodeCharacter((ch >> (2 * (state + 1))) + prev)); prev = 0; for (char i = 0; i < 2 * (state + 1); i++) { prev += ch & (1 << i); } prev = prev << (6 - (2 * (state + 1))); if (state == 2) { code_str.push_back(encodeCharacter(prev)); prev = 0; } state = (state + 1) % 3; } if (state) { code_str.push_back(encodeCharacter(prev)); code_str.append(3 - state, '='); } encoded = true; } // By koihia ``` ## Reference
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up