Loading [MathJax]/extensions/tex2jax.js

Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

Base64のプログラムのサンプル(C++言語)と解説

投稿日:2022年1月24日 更新日:

 

<目次>

(1) Base64のプログラムのサンプル(C++言語)と解説
 (1-1) Base64とは?
 (1-2) Base64のプログラム例(C++)

(1) Base64のプログラムのサンプル(C++言語)と解説

(1-1) Base64とは?

(参考)Base64とは?概要やアルゴリズムについてご紹介

目次にもどる

(1-2) Base64のプログラム例(C++)

早速ですが、Base64の実装例を見ていきます。今回は、既存のサイトのプログラムについてコメントを付加する形で解説を加えていますので、ご了承ください。
 
(引用元サイト)

https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/index#cpp-base64-h

(メソッド概要)

base64_encode ・引数でエンコード対象の文字列とその長さを受け取る
・while文で文字をループ
 ∟3文字読み込んだら、そのセットでエンコード処理を実施(4文字に変換)
 ∟変換後の結果(4文字)を結果用の変数に格納
・最後の3文字セットが作れない端数部分のデコード処理があれば実行
base64_decode ・引数でエンコード結果を受け取る
・while文で文字をループ
 ∟4文字読み込んだら、そのセットでデコード処理を実施(3文字に変換)
 ∟変換後の結果(3文字)を結果用の変数に格納
・最後の4文字セットが作れない端数部分のデコード処理があれば実行
main テスト用のmainメソッド

(サンプル)

  1. /*
  2. ・本ソースコードは下記サイトより引用しています。
  3. (変数:base64_chars、メソッド:base64_encode、base64_decode)
  4. https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/index#cpp-base64-h
  5. ・コメントについては全て"rainbow-engine.com"にて追記をしています。
  6. ・テスト用のmainメソッドについては"rainbow-engine.com"にて作成をしています。
  7. */
  8.  
  9. #include <iostream>
  10. #include <sstream>
  11. using namespace std;
  12.  
  13. static const string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  14.  
  15.  
  16. static inline bool is_base64(unsigned char c) {
  17. return (isalnum(c) || (c == '+') || (c == '/'));
  18. }
  19.  
  20. //# エンコードメソッド
  21. //# 第一引数: Base64のエンコード対象の文字列
  22. //# 第二引数: Base64のエンコード対象の文字列の長さ
  23. string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  24.  //# 結果格納用の変数
  25. string ret;
  26. //# ループ用の変数
  27. int i = 0;
  28. int j = 0;
  29. //# 「_3」はBase64変換前の文字セット(8bit×3=24bit)
  30. //# 「_4」はBase64変換後の文字セット(6bit×4=24bit)
  31. unsigned char char_array_3[3];
  32. unsigned char char_array_4[4];
  33.  
  34. //# 入力文字列の文字数だけwhileで繰り返す(in_len--)
  35. while (in_len--) {
  36. //# Base64変換前の文字セット(8bit×3=24bit)に、入力の文字を1文字格納する
  37. char_array_3[i++] = *(bytes_to_encode++);
  38. //# 3の倍数でBase64エンコード変換を実施
  39. if (i == 3) {
  40. //# [00000011] [11112222] [22333333]の形で3バイトを6ビット毎に分割し、4バイトに再格納
  41. //# 「& 0xXX」はマスクで、例えば「0xfc」なら「11111100」で先頭6ビットのみ残して、残りは切り落とす
  42. //# 「>> N」や「<< N」はビットシフト演算子で、ビット内のバイトを右や左にズラします。
  43. //#  ⇒詳細は次で紹介する「値出力」版のプログラムを見ると、より理解が深まります。
  44. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  45. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  46. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  47. char_array_4[3] = char_array_3[2] & 0x3f;
  48. //# Base64の変換表に沿って、変換後の文字列を結果変数(ret)に格納
  49. for(i = 0; (i <4) ; i++)
  50. ret += base64_chars[char_array_4[i]];
  51. //# 次の3文字セットのループに移るため、iの値をリセット
  52. i = 0;
  53. }
  54. }
  55. //# while文を抜けて、もし「i」が0でない場合
  56. //# ⇒これ以上3の倍数が作れずに1文字or2文字で余った場合に、この分岐に突入
  57. if (i)
  58. {
  59. //# 端数で3文字に満たない部分はゼロ埋め
  60. for(j = i; j < 3; j++)
  61. char_array_3[j] = '\0';
  62. //# 3の倍数の時と同じ処理(8ビット×3組 →6ビット×4組へ変換 →8ビット×4組へ補完)を実施
  63. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  64. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  65. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  66. char_array_4[3] = char_array_3[2] & 0x3f;
  67.  
  68. //# Base64の変換表に沿って、変換後の文字列を結果変数(ret)に格納
  69. for (j = 0; (j < i + 1); j++)
  70. ret += base64_chars[char_array_4[j]];
  71. //# 8ビットが全て「0」埋めされているchar_array_4は「'='」で埋める
  72. while((i++ < 3))
  73. ret += '=';
  74.  
  75. }
  76.  
  77. return ret;
  78.  
  79. }
  80.  
  81. //# デコードメソッド
  82. //# 第一引数: Base64のエンコード結果の文字列
  83. string base64_decode(string const& encoded_string) {
  84. //# エンコード結果の文字列の長さを取得
  85. int in_len = encoded_string.size();
  86. //# ループ用の変数
  87. int i = 0;
  88. int j = 0;
  89. int in_ = 0;
  90. //# 「_4」はBase64変換後のエンコード済み文字セット(6bit×4=24bit)
  91. //# 「_3」はBase64変換前のデコード済み文字セット(8bit×3=24bit)
  92. unsigned char char_array_4[4], char_array_3[3];
  93. //# 結果格納用の変数
  94. string ret;
  95.  
  96. //# 入力文字列の文字数だけwhileで繰り返す(in_len--) かつ 文字が'='でない場合
  97. while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
  98. //# Base64変換後の文字セット(8bit×4=32bit)に、入力の文字を1文字格納する
  99. char_array_4[i++] = encoded_string[in_]; in_++;
  100. //# 4の倍数でBase64のデコード変換を実施
  101. if (i ==4) {
  102. for (i = 0; i <4; i++)
  103. char_array_4[i] = base64_chars.find(char_array_4[i]);
  104. //# エンコード時の逆の処理を実施
  105. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  106. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  107. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  108. //# 変換後の文字列を結果変数(ret)に格納
  109. for (i = 0; (i < 3); i++)
  110. ret += char_array_3[i];
  111. //# 次の3文字セットのループに移るため、iの値をリセット
  112. i = 0;
  113. }
  114. }
  115.  
  116. //# もし「i」が0でない場合で「'='」にぶつかった場合
  117. //# ⇒これ以上4の倍数が作れずに1文字or2文字or3文字で余った場合に、この分岐に突入
  118. if (i) {
  119. for (j = i; j <4; j++)
  120. char_array_4[j] = 0;
  121.  
  122. for (j = 0; j <4; j++)
  123. char_array_4[j] = base64_chars.find(char_array_4[j]);
  124. //# エンコード時の逆の処理を実施
  125. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  126. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  127. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  128.  
  129. for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  130. }
  131.  
  132. return ret;
  133. }
  134.  
  135. //#################################
  136. //# RainbowPlanet独自追加
  137. //# テスト用のmainメソッド
  138. //# 「unsigned char input_str[]」の値を自由に変えて使って見てください
  139. //#################################
  140. int main(void){
  141. //# 文字列リテラルは「const char[X]」型になる。
  142. //# 更に「unsigned」が付いているため、「unsigned const char[X]」になる
  143. unsigned char input_str[] = "RainbowEngine";
  144. //unsigned char* input_str_ptr = input_str;
  145. int len_str;
  146. //# 文字列の長さを計算
  147. //# [文字列全体の長さ] / [文字列1文字目の長さ]
  148. len_str = sizeof(input_str) / sizeof(input_str[0]);
  149. //# 終端文字(ヌル文字)の除去
  150. len_str -= 1;
  151. cout <<"(1)入力文字列 : "<< input_str << endl;
  152. cout <<"(2)エンコード後文字列 : "<< base64_encode(input_str, len_str)<< endl;
  153. cout <<"(3)デコード後文字列 : "<< base64_decode(base64_encode(input_str, len_str))<< endl;
  154. }
 
 
(図111)実行結果
エンコードの例です。「RainbowEngine」を入力し、エンコードすると「UmFpbmJvd0VuZ2luZQ==」になり
その後またデコードして戻すと「RainbowEngine」に戻る事が確認できました。

●値を細かく出力して流れを追う

Base64のエンコード、デコードはビットの「マスク」や「シフト」を多分に用いるため、ソースだけを追っていると非常にイメージしにくい部分があります。そのため、値をcoutやprintして追って見たのが以下のプログラムです。

(サンプル)

  1. /*
  2. ・本ソースコードは下記サイトより引用しています。
  3. (変数:base64_chars、メソッド:base64_encode、base64_decode)
  4. https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/index#cpp-base64-h
  5. ・コメントについては全て"rainbow-engine.com"にて追記をしています。
  6. ・テスト用のmainメソッドについては"rainbow-engine.com"にて作成をしています。
  7. */
  8.  
  9. #include <iostream>
  10. #include <sstream>
  11. #include <bitset>
  12. using namespace std;
  13.  
  14. static const string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  15.  
  16.  
  17. static inline bool is_base64(unsigned char c) {
  18. return (isalnum(c) || (c == '+') || (c == '/'));
  19. }
  20.  
  21. //# エンコードメソッド
  22. //# 第一引数: Base64のエンコード対象の文字列
  23. //# 第二引数: Base64のエンコード対象の文字列の長さ
  24. string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  25. //# 結果格納用の変数
  26. string ret;
  27. //# ループ用の変数
  28. int i = 0;
  29. int j = 0;
  30. //# 「_3」はBase64変換前の文字セット(8bit×3=24bit)
  31. //# 「_4」はBase64変換後の文字セット(6bit×4=24bit)
  32. unsigned char char_array_3[3];
  33. unsigned char char_array_4[4];
  34.  
  35. //# 入力文字列の文字数だけwhileで繰り返す(in_len--)
  36. while (in_len--) {
  37. cout << "===LOOP:" << in_len << " i=" << i << " char_array_3[" << i << "] : " << *(bytes_to_encode) << endl;
  38. //# Base64変換前の文字セット(8bit×3=24bit)に、入力の文字を1文字格納する
  39. char_array_3[i++] = *(bytes_to_encode++);
  40. //# 3の倍数でBase64エンコード変換を実施
  41. if (i == 3) {
  42. //# char_array_3[0]= 01010010 ⇒1文字目のバイト[R]
  43. //# char_array_3[0] & 0xfc = 01010010 & 11111100(マスク) = 01010000
  44. //# (char_array_3[0] & 0xfc) >> 2 = 00010100 ⇒1文字目のバイトの最初の6ビットを取得し、2ビット右にシフト
  45. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  46. //# 値の出力確認
  47. bitset<8> char_array_4_1(char_array_4[0]);
  48. bitset<8> char_array_3_1(char_array_3[0] & 0xfc); //# 1バイト目の先頭6ビット
  49. cout << "====== char_array_4[0]= " << char_array_4_1 << " char_array_3_1= " << char_array_3_1 << endl;
  50. //# char_array_3[0]= 01010010 ⇒1文字目のバイト[R]
  51. //# char_array_3[0] & 0x03 = 01010010 & 00000011(マスク) = 00000010
  52. //# (char_array_3[0] & 0x03) >> 4 = 00100000 ⇒1文字目のバイトの末尾の2ビットを取得し、4ビット左にシフト
  53. //# char_array_3[1]= 01100001 ⇒2文字目のバイト[a]
  54. //# char_array_3[1] & 0xf0 = 01100001 & 11110000(マスク) = 01100000
  55. //# (char_array_3[1] & 0xf0) >> 4 = 00000110 ⇒2文字目のバイトの最初の4ビットを取得し、4ビット右にシフト
  56. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  57. //# 値の出力確認
  58. bitset<8> char_array_4_2(char_array_4[1]);
  59. bitset<8> char_array_3_2_1(char_array_3[0] & 0x03); //# 1バイト目の末尾2ビット
  60. bitset<8> char_array_3_2_2(char_array_3[1] & 0xf0); //# 2バイト目の先頭4ビット
  61. cout << "====== char_array_4[1]= " << char_array_4_2 << " char_array_3_2_1= " << char_array_3_2_1 << " char_array_3_2_2= " << char_array_3_2_2 << endl;
  62.  
  63. //# char_array_3[1]= 01100001 ⇒2文字目のバイト[a]
  64. //# char_array_3[1] & 0x0f = 01100001 & 00001111(マスク) = 00000001
  65. //# (char_array_3[1] & 0x0f) << 2 = 00000100 ⇒2文字目のバイトの末尾の4ビットを取得し、2ビット左にシフト
  66. //# char_array_3[2]= 01101001 ⇒2文字目のバイト[i]
  67. //# char_array_3[2] & 0xc0 = 01101001 & 11000000(マスク) = 01000000
  68. //# (char_array_3[2] & 0xc0) >> 6 = 00000001 ⇒3文字目のバイトの最初の2ビットを取得し、6ビット右にシフト
  69. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  70. //# 値の出力確認
  71. bitset<8> char_array_4_3(char_array_4[2]);
  72. bitset<8> char_array_3_3_1(char_array_3[1] & 0x0f); //# 2バイト目の末尾4ビット
  73. bitset<8> char_array_3_3_2(char_array_3[2] & 0xc0); //# 3バイト目の先頭2ビット
  74. cout << "====== char_array_4[2]= " << char_array_4_3 << " char_array_3_3_1= " << char_array_3_3_1 << " char_array_3_3_2= " << char_array_3_3_2 << endl;
  75.  
  76.  
  77. //# char_array_3[2]= 01101001 ⇒2文字目のバイト[i]
  78. //# char_array_3[2] & 0x3f = 01101001 & 00111111(マスク) = 00101001
  79. //# char_array_3[2] & 0x3f ⇒3文字目のバイトの末尾の6ビットを取得する
  80. char_array_4[3] = char_array_3[2] & 0x3f;
  81. //# 値の出力確認
  82. bitset<8> char_array_4_4(char_array_4[3]);
  83. cout << "====== char_array_4[3]= " << char_array_4_4 << endl;
  84. //# 変換後の文字列を結果変数(ret)に格納
  85. for(i = 0; (i <4) ; i++)
  86. ret += base64_chars[char_array_4[i]];
  87. //# 次の3文字セットのループに移るため、iの値をリセット
  88. i = 0;
  89. }
  90.  
  91. }
  92. //# while文を抜けて、もし「i」が0でない場合
  93. //# ⇒これ以上3の倍数が作れずに1文字or2文字で余った場合に、この分岐に突入
  94. if (i)
  95. {
  96. //# 端数で3文字に満たない部分はゼロ埋め
  97. //# RainbowEngineの例では、[0]=e、[1]=0埋め、[2]=0埋めとなる
  98. for(j = i; j < 3; j++){
  99. char_array_3[j] = '\0';
  100. cout << "======== j= " << j << " char_array_3[j]:" << char_array_3[j] << endl;
  101. }
  102. //# 3の倍数の時と同じ処理(8ビット×3組 →6ビット×4組へ変換 →8ビット×4組へ補完)を実施
  103. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  104. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  105. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  106. char_array_4[3] = char_array_3[2] & 0x3f;
  107.  
  108. //# Base64の変換表に沿って、変換後の文字列を結果変数(ret)に格納
  109. for (j = 0; (j < i + 1); j++){
  110. ret += base64_chars[char_array_4[j]];
  111. cout << "========== j=" << j << " ret:" << ret << endl;
  112. }
  113. //# 8ビットが全て「0」埋めされているchar_array_4は「'='」で埋める
  114. while((i++ < 3))
  115. ret += '=';
  116.  
  117. }
  118. return ret;
  119.  
  120. }
  121.  
  122. //# デコードメソッド
  123. //# 第一引数: Base64のエンコード結果の文字列
  124. string base64_decode(string const& encoded_string) {
  125. //# エンコード結果の文字列の長さを取得
  126. int in_len = encoded_string.size();
  127. //# ループ用の変数
  128. int i = 0;
  129. int j = 0;
  130. int in_ = 0;
  131. //# 「_4」はBase64変換後のエンコード済み文字セット(6bit×4=24bit)
  132. //# 「_3」はBase64変換前のデコード済み文字セット(8bit×3=24bit)
  133. unsigned char char_array_4[4], char_array_3[3];
  134. //# 結果格納用の変数
  135. string ret;
  136.  
  137. //# 入力文字列の文字数だけwhileで繰り返す(in_len--) かつ 文字が'='でない場合
  138. while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
  139. cout << "===LOOP:" << in_len << " i=" << i << " char_array_4[" << i << "] : " << encoded_string[in_] << endl;
  140. //# Base64変換後の文字セット(8bit×4=32bit)に、入力の文字を1文字格納する
  141. char_array_4[i++] = encoded_string[in_]; in_++;
  142. //# 4の倍数でBase64のデコード変換を実施
  143. if (i ==4) {
  144. for (i = 0; i <4; i++)
  145. char_array_4[i] = base64_chars.find(char_array_4[i]);
  146. //# エンコード時の逆の処理を実施
  147.  
  148. //# char_array_4[0]= 00010100 ⇒1文字目のバイト[U] →2ビット左シフト
  149. //# char_array_4[1] & 0x30 = 00100110 & 00110000(マスク) = 00[10]0000 ⇒2文字目のバイト[m] →4ビット右シフト
  150. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  151. //# 値の出力確認
  152. bitset<8> char_array_4_0(char_array_4[0]);
  153. bitset<8> char_array_4_1_1(char_array_4[1] & 0x30);
  154. bitset<8> char_array_3_0(char_array_3[0]);
  155. cout << "====== char_array_3[0]= " << char_array_3_0 << " char_array_4_0= " << char_array_4_0 << " char_array_4_1_1= " << char_array_4_1_1 << endl;
  156. //# char_array_4[1] & 0xf = 00100110 & 00001111(マスク) = 0000[0110] ⇒2文字目のバイト[m] →4ビット左シフト
  157. //# char_array_4[2] & 0x30 = 00000101 & 00111100(マスク) = 00[0001]00 ⇒3文字目のバイト[F] →2ビット右シフト
  158. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  159. //# 値の出力確認
  160. bitset<8> char_array_4_1_2(char_array_4[1] & 0xf);
  161. bitset<8> char_array_4_2_1(char_array_4[2] & 0x3c);
  162. bitset<8> char_array_3_1(char_array_3[1]);
  163. cout << "====== char_array_3[1]= " << char_array_3_1 << " char_array_4_1_2= " << char_array_4_1_2 << " char_array_4_2_1= " << char_array_4_2_1 << endl;
  164. //# char_array_4[2] & 0x30 = 00000101 & 00000011(マスク) = 000000[01] ⇒3文字目のバイト[F] →6ビット左シフト
  165. //# char_array_4[3]= 00101001 ⇒4文字目のバイト[p]
  166. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  167. //# 値の出力確認
  168. bitset<8> char_array_4_2_2(char_array_4[2] & 0x3);
  169. bitset<8> char_array_4_3(char_array_4[3]);
  170. bitset<8> char_array_3_2(char_array_3[2]);
  171. cout << "====== char_array_3[2]= " << char_array_3_2 << " char_array_4_2_2= " << char_array_4_2_2 << " char_array_4_3= " << char_array_4_3 << endl;
  172. //# 変換後の文字列を結果変数(ret)に格納
  173. for (i = 0; (i < 3); i++)
  174. ret += char_array_3[i];
  175. //# 次の3文字セットのループに移るため、iの値をリセット
  176. i = 0;
  177. }
  178. }
  179.  
  180. //# もし「i」が0でない場合で「'='」にぶつかった場合
  181. //# ⇒これ以上4の倍数が作れずに1文字or2文字or3文字で余った場合に、この分岐に突入
  182. if (i) {
  183. for (j = i; j <4; j++)
  184. char_array_4[j] = 0;
  185.  
  186. for (j = 0; j <4; j++)
  187. char_array_4[j] = base64_chars.find(char_array_4[j]);
  188. //# エンコード時の逆の処理を実施
  189. char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
  190. char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
  191. char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
  192.  
  193. for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
  194. }
  195.  
  196. return ret;
  197. }
  198.  
  199. int main(void){
  200. //# 文字列リテラルは「const char[X]」型になる。
  201. //# 更に「unsigned」が付いているため、「unsigned const char[X]」になる
  202. unsigned char input_str[] = "RainbowEngine";
  203. //unsigned char* input_str_ptr = input_str;
  204. int len_str;
  205. //# 文字列の長さを計算
  206. //# [文字列全体の長さ] / [文字列1文字目の長さ]
  207. len_str = sizeof(input_str) / sizeof(input_str[0]);
  208. //# 終端文字(ヌル文字)の除去
  209. len_str -= 1;
  210. cout <<"(1)入力文字列 : "<< input_str << endl;
  211. //cout <<"(2)エンコード後文字列 : " << endl << base64_encode(input_str, len_str)<< endl;
  212. //cout <<"(3)デコード後文字列 : "<< base64_decode(base64_encode(input_str, len_str))<< endl;
  213. cout <<"(3)デコード後文字列 : "<< endl << base64_decode("UmFpbmJvd0VuZ2luZQ==")<< endl;
  214. }
 
(図121)実行結果
文字を1文字ずつ読み込み、U→m→F→pと4文字揃ったタイミングでデコード処理をしている様子がうかがえます。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

GDBの使い方をC++のプログラムのデバッグを例にご紹介

  <目次> (1) GDBの使い方をC++のプログラムのデバッグを例にご紹介  (1-1) GDBのデバッグのシナリオ概要(例)  (1-2) GDBのデバッグ手順(例)  (1-3) そ …

Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)

  <目次> (1) Valgrindとは?使い方や概要をご紹介(メモリリーク検知ツール)  (1-1) Valgrindとは?  (1-2) Valgrindの導入方法  (1-3) Va …

C++の「->」(アロー演算子)とは?意味や使い方をご紹介

  <目次> (1) C++の「->」(アロー演算子)とは?意味や使い方をご紹介  (1-1) C++の「->」(アロー演算子=arrow operator)とは?  (1-2) …

C++のマルチスレッド処理のサンプルや概要について

  <目次> (1) C++のマルチスレッド処理のサンプルや概要について  (1-1) C++のマルチスレッドの概要  (1-2) 構文1:関数ポインタ式  (1-3) 構文1(例):関数ポ …

C++の「::」の記載の意味について

  <目次> (1) C++の「::」の記載の意味について  (1-1) 「::」の意味は?  (1-2) サンプル①:スコープ演算子「::」を使ってグローバル変数にアクセス  (1-3) …

  • English (United States)
  • 日本語
S