Rainbow Engine

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

C++

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

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

 

<目次>

(1) Base64とは?概要やアルゴリズムについてご紹介
 (1-1) Base64とは?
 (1-2) Base64の仕組み
 (1-3) Base64の実装

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

(1-1) Base64とは?

●概要

バイナリ⇒テキスト(ASCII形式)にエンコードする方式です。あらゆる文字(漢字、絵文字、画像も)を、可読の文字(ASCII形式)に変換可能にする事で、保存や転送を可能にします。ネットワーク間でバイナリ形式のデータを「テキスト形式で運ぶ」目的で作られました。Base64ではあらゆる形式のデータを「文字列」に変換する事が出来るため、テキストデータを保存・転送するメディア等にも対応しているのがBase64の強みです。

●なぜ必要?

文字列に変換する目的は、どんな経路でも内容を正しく運ぶためです。プロトコルによっては、バイナリデータの一部を意図せず「制御文字」として認識したりする事で、バイナリデータが変化してしまう可能性もゼロではありません。そうした危険を防ぐためにも、予めBase64での変換を行った上で転送します。

●なぜ64?

エンコーディング処理の過程において、64種類の文字(=2^6)を使用するためです。この64文字は、ほぼ全てのエンコーディング方式にて利用可能です。

(1-2) Base64の仕組み

●仕組み

Base64のエンコーディングは、「US-ASCII」文字セットの内の65文字を用いて行います。その内の最初の64文字(アルファベット大文字&小文字+数字+「+」+「/」)には、それぞれ対応する6ビット(2^6ビット=64個)の値が割り当てられており、最後にお65文字目(=)はパディング(データ長を一定に保つ為のデータ)です。
(表)

0 A 20 U 40 o 60 8
1 B 21 V 41 p 61 9
2 C 22 W 42 q 62 +
3 D 23 X 43 r 63 /
4 E 24 Y 44 s (pad) =
5 F 25 Z 45 t  
6 G 26 a 46 u  
7 H 27 b 47 v  
8 I 28 c 48 w  
9 J 29 d 49 x  
10 K 30 e 50 y  
11 L 31 f 51 z  
12 M 32 g 52 0  
13 N 33 h 53 1  
14 O 34 i 54 2  
15 P 35 j 55 3  
16 Q 36 k 56 4  
17 R 37 l 57 5  
18 S 38 m 58 6  
19 T 39 n 59 7  

●処理の基本的な流れ

Base64のエンコーディング処理は、入力ストリーム(連続したバイト読込み)から1バイト(8ビット)単位にデータを受信し、それを左→右に8ビット×3=24ビットのグループ(3文字)にまとめて処理していきます。
 
(例)RainbowEngineの場合
01010010 01100001 01101001 = R a i
01101110 01100010 01101111 = n b o
01110111 01000101  01101110 = w E n
01100111 01101001 01101110 = g i n
 
・①8ビットのデータ3組を受信し、左から並べて連結して24ビットのグループを作ります。

01010010 01100001 01101001 = R a i
 
・②「①」の状態を、6ビット×4組に区切り直し、Base64の1文字に対応するように先頭2ビットに0を埋めて、8ビット×4組に仕上げます(実際のプログラムでは、マスクとビットシフトを組み合わせて実装)。
(前)8ビット×3組
01010010 01100001 01101001
(中)6ビット×4組
010100 100110 000101 101001
(後)8ビット×4組
00010100 00100110 00000101 00101001

(図121)

 
・③6ビットに区切り直した各データをBase64のアルファベットに変換します。
 
(前)8ビット×4組
00010100 00100110 00000101 00101001
変換表(表1)に従って変換
(後)Base64のエンコーディング完了
U m F p
基本的には、入力された文字列に対して上記①~③を繰り返していきますが、文字数が丁度3で割り切れない場合は、最後の端数の1文字or2文字に対しては少し特殊な処理を行う必要があります(→次の④)。
 
・④受信データが8ビットのデータ3組(24ビット)に満たない場合
不足分を0埋めで補います。8ビットが全て「0」の場合は「=」に変換されるため、次の2パターンに分類され、「=」が1回か2回登場します。

(a)余り部分=8ビットの場合

8ビット + 0埋め×4個 → 6ビット×2組を形成 +「=」を2個追加

(b)余り部分=16ビットの場合
 
16ビット + 0埋め×2個 → 6ビット×3組を形成 +「=」を1個追加
 

(1-3) Base64の実装

→(参考)Base64のサンプルプログラム(C++)の紹介と解説 ★

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

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

関連記事

C++のtime関数とlocaltime関数の違いについて

  <目次> (1) C++のtime関数とlocaltime関数の違いについて  (1-1) C++のlocaltime関数の概要とサンプル  (1-2) C++のtime関数の概要とサン …

パイプ通信とは?概要やサンプルプログラムをご紹介

  <目次> (1) パイプ通信とは?概要やサンプルプログラムをご紹介  (1-1) パイプ通信の概要  (1-2) パイプ通信の構文  (1-3) パイプ通信のサンプルプログラム①(単一プ …

no image

C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

<目次> (1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an …

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

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

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

  • English (United States)
  • 日本語
Top