16 #ifndef INCLUDE_NN_NLIB_BASE64_H_ 17 #define INCLUDE_NN_NLIB_BASE64_H_ 21 #ifdef __cpp_rvalue_references 39 kBase64Default = kBase64PlusSlash,
40 kBase64UrlSafe = kBase64MinusUnderscore
45 return ((srcsize + 2) / 3) * 4 + 1;
48 Encode(
char* dst,
size_t dstsize,
const void* src,
size_t srcsize,
49 CharOption char_option = kBase64Default,
bool padding =
false)
NLIB_NOEXCEPT;
52 Encode(
char (&dst)[N], const
void* src,
size_t srcsize,
CharOption char_option = kBase64Default,
54 return Encode(dst, N, src, srcsize, char_option, padding);
57 #ifdef NLIB_CXX11_DEFAULT_TEMPLATE_ARGUMENT_FOR_FUNCTION_TEMPLATES 58 template<
class DUMMY =
void>
64 size_t dstsize = GetRequiredSize(srcsize);
66 char* p =
new (std::nothrow)
char[dstsize];
67 if (!p)
return ENOMEM;
68 errno_t e = Encode(p, dstsize, src, srcsize, char_option, padding);
75 #ifdef __cpp_rvalue_references 76 static std::pair<errno_t, std::unique_ptr<char[]> >
79 size_t dstsize = GetRequiredSize(srcsize);
80 char* p =
new (std::nothrow)
char[dstsize];
81 if (!p) return ::std::make_pair(ENOMEM,
nullptr);
82 errno_t e = Encode(p, dstsize, src, srcsize, char_option, padding);
84 return ::std::make_pair(0,
UniquePtr<
char[]>(p));
86 return ::std::make_pair(e,
nullptr);
94 errno_t StepEncode(
size_t* written,
char* dst,
size_t dstsize,
const void* src,
100 return StepEncode(written, dst, N, src, srcsize);
102 std::pair<errno_t, size_t>
105 errno_t e = StepEncode(&written, dst, dstsize, src, srcsize);
106 return std::make_pair(e, written);
109 std::pair<errno_t, size_t>
111 return StepEncode(&dst[0], N, src, srcsize);
120 return Close(written, dst, N, padding);
124 errno_t e = Close(&written, dst, dstsize, padding);
125 return std::make_pair(e, written);
129 return Close(dst, N, padding);
143 kBase64PlusSlash = 0,
152 kBase64Default = kBase64PlusSlash,
153 kBase64UrlSafe = kBase64MinusUnderscore
158 static errno_t Decode(
size_t* written,
void* dst,
size_t dstsize,
const char* src,
160 return Decode_(written, static_cast<nlib_byte_t*>(dst), dstsize, src,
nlib_strlen(src),
166 return Decode_(written, dst, N, src,
nlib_strlen(src), char_option);
168 static std::pair<errno_t, size_t>
169 Decode(
void* dst,
size_t dstsize,
const char* src,
172 errno_t e = Decode(&written, dst, dstsize, src, char_option);
173 return std::make_pair(e, written);
176 static std::pair<errno_t, size_t>
179 return Decode(dst, N, src, char_option);
181 #ifdef NLIB_CXX11_DEFAULT_TEMPLATE_ARGUMENT_FOR_FUNCTION_TEMPLATES 182 template<
class DUMMY =
void>
188 size_t dstsize_ = GetRequiredSize(srcsize);
190 uint8_t* p =
new (std::nothrow) uint8_t[dstsize_];
191 if (!p)
return ENOMEM;
193 errno_t e = Decode_(&written, reinterpret_cast<nlib_byte_t*>(p), dstsize_, src, srcsize,
203 #ifdef __cpp_rvalue_references 204 static std::tuple<errno_t, std::unique_ptr<nlib_byte_t[]>,
size_t>
207 size_t dstsize = GetRequiredSize(srcsize);
209 if (!p) return ::std::make_tuple(ENOMEM,
nullptr, 0);
211 errno_t e = Decode_(&written, p, dstsize, src, srcsize, char_option);
216 return ::std::make_tuple(e,
nullptr, 0);
221 DecodeInplace(
size_t* written,
char* src,
224 #if defined(NLIB_SIMD) && defined(NLIB_LITTLE_ENDIAN) 231 errno_t StepDecode(
size_t* written,
void* dst,
size_t dstsize,
const char* src,
236 return StepDecode(written, dst, N, src, srcsize);
238 std::pair<errno_t, size_t>
241 errno_t e = StepDecode(&written, dst, dstsize, src, srcsize);
242 return std::make_pair(e, written);
245 std::pair<errno_t, size_t>
247 return StepDecode(dst, N, src, srcsize);
252 return Close(written, dst, N);
256 errno_t e = Close(&written, dst, dstsize);
257 return std::make_pair(e, written);
261 return Close(&dst[0], N);
266 static
errno_t Decode_(
size_t* written,
nlib_byte_t* dst,
size_t dstsize, const
char* src,
271 #if defined(NLIB_SIMD) && defined(NLIB_LITTLE_ENDIAN) 281 #endif // INCLUDE_NN_NLIB_BASE64_H_ errno_t StepEncode(size_t *written, char(&dst)[N], const void *src, size_t srcsize) noexcept
上記関数のテンプレートオーバーロードです。
CharOption
Base64の62番目と63番目の文字のバリエーションを指定できます。
62番目の文字に'-'、63番目の文字に'_'を指定します。
62番目の文字に'.'、63番目の文字に'-'を指定します。
std::pair< errno_t, size_t > StepDecode(nlib_byte_t(&dst)[N], const char *src, size_t srcsize) noexcept
上記関数のテンプレートオーバーロードです。
Base64のデコードを行います。Base64の各種変形版をサポートします。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
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 Encode(UniquePtr< char[]> &dst, const void *src, size_t srcsize, CharOption char_option=kBase64Default, bool padding=false) noexcept
データを一括してエンコードします。
static errno_t Decode(UniquePtr< uint8_t[]> &dst, size_t *dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
データを一括してデコードします。
std::pair< errno_t, size_t > Close(char(&dst)[N], bool padding) noexcept
上記関数のテンプレートオーバーロードです。
std::pair< errno_t, size_t > StepEncode(char *dst, size_t dstsize, const void *src, size_t srcsize) noexcept
Base64の分割エンコードを行います。末尾にヌル文字は追加されません。エラー値とdstに書き込まれたバイト数...
62番目の文字に'.'、63番目の文字に'_'を指定します。
62番目の文字に'!'、63番目の文字に'-'を指定します。
C++11環境(エイリアステンプレートが可能な環境)においてはstd::unique_ptrにエイリアステンプレートされま...
std::unique_ptrに相当するクラスが定義されています。
62番目の文字に'_'、63番目の文字に'-'を指定します。
CharOption
Base64の62番目と63番目の文字のバリエーションを指定できます。
errno_t StepDecode(size_t *written, nlib_byte_t(&dst)[N], const char *src, size_t srcsize) noexcept
上記関数のテンプレートオーバーロードです。
errno_t Close(size_t *written, char(&dst)[N], bool padding) noexcept
上記関数のテンプレートオーバーロードです。
static std::pair< errno_t, size_t > Decode(nlib_byte_t(&dst)[N], const char *src, CharOption char_option=kBase64Default) noexcept
上記関数のテンプレートオーバーロードです。
Base64のエンコードを行います。Base64の各種変形版をサポートします。
62番目の文字に'.'、63番目の文字に'_'を指定します。
errno_t Close(size_t *written, nlib_byte_t(&dst)[N]) noexcept
上記関数のテンプレートオーバーロードです。
62番目の文字に'_'、63番目の文字に':'を指定します。
static errno_t Decode(size_t *written, nlib_byte_t(&dst)[N], const char *src, CharOption char_option=kBase64Default) noexcept
上記関数のテンプレートオーバーロードです。
std::pair< errno_t, size_t > Close(void *dst, size_t dstsize) noexcept
Base64の分割デコードを終了します。エラー値とdstに書き込まれたバイト数のペアを返します。 ...
62番目の文字に'.'、63番目の文字に'-'を指定します。
std::pair< errno_t, size_t > StepEncode(char(&dst)[N], const void *src, size_t srcsize) noexcept
上記関数のテンプレートオーバーロードです。
62番目の文字に'-'、63番目の文字に'_'を指定します。
62番目の文字に'_'、63番目の文字に':'を指定します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
static size_t GetRequiredSize(size_t srcsize) noexcept
データのデコードに必要な領域のサイズを計算します。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
static errno_t Decode(size_t *written, void *dst, size_t dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
データを一括してデコードします。
static std::pair< errno_t, std::unique_ptr< char[]> > Encode(const void *src, size_t srcsize, CharOption char_option=kBase64Default, bool padding=false) noexcept
データを一括でエンコードし、内部でメモリを割り当てて返します。
62番目の文字に'+'、63番目の文字に'-'を指定します。
static std::pair< errno_t, size_t > Decode(void *dst, size_t dstsize, const char *src, CharOption char_option=kBase64Default) noexcept
データを一括してデコードします。エラー値と出力されたデータサイズのペアを返します。 ...
62番目の文字に'_'、63番目の文字に'-'を指定します。
62番目の文字に'!'、63番目の文字に'-'を指定します。
62番目の文字に'+'、63番目の文字に'-'を指定します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
constexpr Base64Decoder() noexcept
デフォルトコンストラクタです。
std::pair< errno_t, size_t > Close(nlib_byte_t(&dst)[N]) noexcept
上記関数のテンプレートオーバーロードです。
static size_t GetRequiredSize(size_t srcsize) noexcept
データのエンコードに必要な領域のサイズを計算します。
constexpr Base64Encoder() noexcept
デフォルトコンストラクタです。
std::pair< errno_t, size_t > StepDecode(void *dst, size_t dstsize, const char *src, size_t srcsize) noexcept
Base64の分割デコードを行います。エラー値とdstに書き込まれたバイト数のペアを返します。 ...
std::pair< errno_t, size_t > Close(char *dst, size_t dstsize, bool padding) noexcept
Base64の分割エンコードを終了します。末端にヌル文字は追加されません。エラー値とdstに書き込まれたバイト...