nlib
nn::nlib::Base64Decoder クラスfinal

Base64のデコードを行います。Base64の各種変形版をサポートします。 [詳解]

#include "nn/nlib/Base64.h"

公開型

enum  CharOption {
  kBase64PlusSlash = 0,
  kBase64PlusMinus,
  kBase64MinusUnderscore,
  kBase64DotMinus,
  kBase64UnderscoreColon,
  kBase64UnderscoreMinus,
  kBase64DotUnderscore,
  kBase64ExclamationMinus ,
  kBase64Default = kBase64PlusSlash,
  kBase64UrlSafe = kBase64MinusUnderscore
}
 Base64の62番目と63番目の文字のバリエーションを指定できます。 [詳解]
 

公開メンバ関数

errno_t StepDecode (size_t *written, void *dst, size_t dstsize, const char *src, size_t srcsize) noexcept
 Base64の分割デコードを行います。 [詳解]
 
template<size_t N>
errno_t StepDecode (size_t *written, nlib_byte_t(&dst)[N], const char *src, size_t srcsize) noexcept
 上記関数のテンプレートオーバーロードです。
 
std::pair< errno_t, size_t > StepDecode (void *dst, size_t dstsize, const char *src, size_t srcsize) noexcept
 Base64の分割デコードを行います。エラー値とdstに書き込まれたバイト数のペアを返します。
 
template<size_t N>
std::pair< errno_t, size_t > StepDecode (nlib_byte_t(&dst)[N], const char *src, size_t srcsize) noexcept
 上記関数のテンプレートオーバーロードです。
 
errno_t Close (size_t *written, void *dst, size_t dstsize) noexcept
 Base64の分割デコードを終了します。 [詳解]
 
template<size_t N>
errno_t Close (size_t *written, nlib_byte_t(&dst)[N]) noexcept
 上記関数のテンプレートオーバーロードです。
 
std::pair< errno_t, size_t > Close (void *dst, size_t dstsize) noexcept
 Base64の分割デコードを終了します。エラー値とdstに書き込まれたバイト数のペアを返します。
 
template<size_t N>
std::pair< errno_t, size_t > Close (nlib_byte_t(&dst)[N]) noexcept
 上記関数のテンプレートオーバーロードです。
 
 operator bool () const
 オブジェクトが初期化済みで内部でエラーが発生していなければtrue、発生していればfalseを返します。
 
コンストラクタ、デストラクタ、及び初期化
constexpr Base64Decoder () noexcept
 デフォルトコンストラクタです。
 
errno_t Init (CharOption char_option=kBase64Default) noexcept
 62番目、63番目の文字を指定してオブジェクトを初期化します。 [詳解]
 

静的公開メンバ関数

static size_t GetRequiredSize (size_t srcsize) noexcept
 データのデコードに必要な領域のサイズを計算します。 [詳解]
 
static errno_t Decode (size_t *written, void *dst, size_t dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
 データを一括してデコードします。 [詳解]
 
template<size_t N>
static errno_t Decode (size_t *written, nlib_byte_t(&dst)[N], const char *src, CharOption char_option=kBase64Default) noexcept
 上記関数のテンプレートオーバーロードです。
 
static std::pair< errno_t, size_t > Decode (void *dst, size_t dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
 データを一括してデコードします。エラー値と出力されたデータサイズのペアを返します。
 
template<size_t N>
static std::pair< errno_t, size_t > Decode (nlib_byte_t(&dst)[N], const char *src, CharOption char_option=kBase64Default) noexcept
 上記関数のテンプレートオーバーロードです。
 
static errno_t Decode (UniquePtr< uint8_t[]> &dst, size_t *dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
 データを一括してデコードします。 [詳解]
 
static std::tuple< errno_t, std::unique_ptr< nlib_byte_t[]>, size_t > Decode (const char *src, CharOption char_option=kBase64Default) noexcept
 データを一括してデコードし、内部でメモリを割り当てて返します。
 
static errno_t DecodeInplace (size_t *written, char *src, CharOption char_option=kBase64Default) noexcept
 データをその場でデコードします。 [詳解]
 

詳解

Base64のデコードを行います。Base64の各種変形版をサポートします。

説明
このクラスはBase64の一括デコード、分割デコード、インプレイスの一括デコードをサポートします。 Base64の各種変形版はCharOption型の値を指定することで利用可能です。 改行やパディングを含む入力もデコード可能です。
参照
https://www.ietf.org/rfc/rfc2045.txt
オブジェクトの状態遷移
オブジェクトの状態遷移の概略は以下のとおりです。
dot_inline_dotgraph_1.png

Base64.h140 行目に定義があります。

列挙型メンバ詳解

◆ CharOption

Base64の62番目と63番目の文字のバリエーションを指定できます。

列挙値
kBase64PlusSlash 

62番目の文字に'+'、63番目の文字に'/'を指定します。

kBase64PlusMinus 

62番目の文字に'+'、63番目の文字に'-'を指定します。

kBase64MinusUnderscore 

62番目の文字に'-'、63番目の文字に'_'を指定します。

kBase64DotMinus 

62番目の文字に'.'、63番目の文字に'-'を指定します。

kBase64UnderscoreColon 

62番目の文字に'_'、63番目の文字に':'を指定します。

kBase64UnderscoreMinus 

62番目の文字に'_'、63番目の文字に'-'を指定します。

kBase64DotUnderscore 

62番目の文字に'.'、63番目の文字に'_'を指定します。

kBase64ExclamationMinus 

62番目の文字に'!'、63番目の文字に'-'を指定します。

kBase64Default 

kBase64PlusSlashと同じです。

kBase64UrlSafe 

kBase64MinusUnderscoreと同じです。

Base64.h142 行目に定義があります。

関数詳解

◆ Close()

nn::nlib::Base64Decoder::Close ( size_t *  written,
void *  dst,
size_t  dstsize 
)
noexcept

Base64の分割デコードを終了します。

引数
[out]writtendstに書き込まれたバイト数
[out]dstデコードが格納されるバッファ
[in]dstsizedstのサイズ
戻り値
0成功した場合
EINVALwritten, dstNULLだった場合
EINVAL以前に何らかのエラーが発生している場合
ERANGEdstsizeが必要なサイズより小さかった場合
説明
dstは2バイト以上の領域が必要です。

◆ Decode() [1/2]

nn::nlib::Base64Decoder::Decode ( size_t *  written,
void *  dst,
size_t  dstsize,
const char *  src,
CharOption  char_option = kBase64Default 
)
inlinestaticnoexcept

データを一括してデコードします。

引数
[out]writtendstに出力されたデータサイズ
[out]dstデコードされたデータが出力されるバッファ
[in]dstsizedstのサイズ
[in]srcエンコードされた文字列
[in]char_option62番目、63番目の文字を指定
戻り値
0ならば成功
説明
以下がコード例です。
const char* base64 = "RGF0YSB0byBlbmNvZGU";
auto result = nlib_ns::Base64Decoder::Decode(base64);
SUCCEED_IF(std::get<0>(result) == 0);
auto data = std::move(std::get<1>(result));
size_t size = std::get<2>(result);
const char* p = reinterpret_cast<const char*>(data.get());
std::string str(p, p + size);
nlib_printf("decoded: %s\n", str.c_str());
/*
Output:
decoded: Data to encode
*/

Base64.h158 行目に定義があります。

◆ Decode() [2/2]

nn::nlib::Base64Decoder::Decode ( UniquePtr< uint8_t[]> &  dst,
size_t *  dstsize,
const char *  src,
CharOption  char_option = kBase64Default 
)
inlinestaticnoexcept

データを一括してデコードします。

引数
[out]dstデコードされたデータ
[out]dstsizedstのサイズ
[in]srcエンコードされた文字列
[in]char_option62番目、63番目の文字を指定
戻り値
0成功した場合
EINVALdstsize, srcNULLだった場合
ENOMEMメモリの確保に失敗した場合
EILSEQ不正な文字があった場合

Base64.h184 行目に定義があります。

◆ DecodeInplace()

nn::nlib::Base64Decoder::DecodeInplace ( size_t *  written,
char *  src,
CharOption  char_option = kBase64Default 
)
staticnoexcept

データをその場でデコードします。

引数
[out]writtensrcに書き込まれたサイズ
[in,out]srcエンコードされた文字列、及びデコードされたデータ
[in]char_option62番目、63番目の文字を指定
戻り値
0成功した場合
EINVALwritten, srcNULLだった場合
EILSEQ不正な文字があった場合
説明
EILSEQを返す場合は途中までデコードできた場合でもwrittenには0が書き込まれます。
以下がコード例です。
char base64[] = "RGF0YSB0byBlbmNvZGUgc3RlcDEKRGF0YSB0byBlbmNvZGUgc3RlcDIK";
size_t written;
SUCCEED_IF(e == 0);
base64[written] = '\0';
nlib_printf("decoded:\n%s", base64);
/*
Output:
decoded:
Data to encode step1
Data to encode step2
*/

◆ GetRequiredSize()

nn::nlib::Base64Decoder::GetRequiredSize ( size_t  srcsize)
inlinestaticnoexcept

データのデコードに必要な領域のサイズを計算します。

引数
[in]srcsizeデコードするデータのサイズ
戻り値
((srcsize + 3) / 4) * 3;を返します。

Base64.h157 行目に定義があります。

◆ Init()

nn::nlib::Base64Decoder::Init ( CharOption  char_option = kBase64Default)
noexcept

62番目、63番目の文字を指定してオブジェクトを初期化します。

引数
[in]char_option62番目、63番目の文字を指定
戻り値
0成功した場合
EALREADY既に初期化済みでエラーが発生していない場合

◆ StepDecode()

nn::nlib::Base64Decoder::StepDecode ( size_t *  written,
void *  dst,
size_t  dstsize,
const char *  src,
size_t  srcsize 
)
noexcept

Base64の分割デコードを行います。

引数
[out]writtendstに書き込まれたバイト数
[out]dstデコードが格納されるバッファ
[in]dstsizedstのサイズ
[in]srcデコードされるデータ
[in]srcsizesrcのサイズ
戻り値
0成功した場合
EINVALwritten, dst, srcNULLだった場合
EINVAL以前に何らかのエラーが発生している場合
ERANGEdstsizeが必要なサイズより小さかった場合
EILSEQ不正な文字があった場合
説明
dstに必要なバッファ・サイズは、GetRequiredSize(srcsize)で計算することができます。 EILSEQを返す場合は途中までデコードできた場合でもwrittenには0が書き込まれます。
以下がコード例です。
char dst[256];
char* p = &dst[0];
size_t dstsize = 256;
const char* base64[] = {
"RGF0YS", "B0byBlbmNvZ", "GU", "gc3RlcDEKRGF0YSB", "0byBlbm", "NvZGUgc3RlcDIK"
};
for (auto& str : base64) {
auto result = decoder.StepDecode(p, dstsize, str, nlib_strlen(str));
SUCCEED_IF(result.first == 0);
p += result.second;
dstsize -= result.second;
}
auto result = decoder.Close(p, dstsize);
SUCCEED_IF(result.first == 0);
p += result.second;
dstsize -= result.second;
SUCCEED_IF(dstsize > 0);
*p = '\0';
nlib_printf("decoded:\n%s", dst);
/*
Output:
decoded:
Data to encode step1
Data to encode step2
*/

このクラス詳解は次のファイルから抽出されました: