英語版
このページの英語版を見る

std.base64

Base64エンコードとデコードをサポートする。
このモジュールはBase64エンコーディングの2つのデフォルト実装を提供する、 Base64標準的なエンコーディング・アルファベットと Base64URLを提供する。 URLやファイル名に埋め込んでも安全なように設計されている。
どちらのバージョンも、テンプレート Base64Impl.ほとんどのユーザーはこのテンプレートを直接使う必要はないだろう。 しかし、カスタマイズされたBase64エンコーディングを作成するために使うことができる、 パディング文字を省略したものや、正規表現に埋め込んでも安全なものなどだ。 を正規表現の中に埋め込んでも安全なものなど、カスタマイズされたBase64エンコーディングを作成するために使うことができる。

例:

ubyte[] data = [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e];

const(char)[] encoded = Base64.encode(data);
assert(encoded == "FPucA9l+");

ubyte[] decoded = Base64.decode("FPucA9l+");
assert(decoded == [0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e]);
レンジAPIはエンコードとデコードの両方でサポートされている:

例:

// 76行目に従って、CRLFでMIME Base64を作成する。
File f = File("./text.txt", "r");
scope(exit) f.close();

Appender!string mime64 = appender!string;

foreach (encoded; Base64.encoder(f.byChunk(57)))
{
    mime64.put(encoded);
    mime64.put("\r\n");
}

writeln(mime64.data);

Authors:
Masahiro Nakagawa, Daniel Murphy (Single value Encoder and Decoder)

出典 std/base64.d

alias Base64 = Base64Impl!('+', '/', '=');
標準Base64エンコーディングの実装。
利用可能なメソッドについては Base64Implを参照のこと。
Examples:
ubyte[] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f];
writeln(Base64.encode(data)); // "g9cwegE/"
writeln(Base64.decode("g9cwegE/")); // data
alias Base64URL = Base64Impl!('-', '_', '=');
URLやファイル名に使用しても安全なBase64エンコーディングのバリエーション。
利用可能なメソッドについては Base64Implを参照のこと。
Examples:
ubyte[] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f];
writeln(Base64URL.encode(data)); // "g9cwegE_"
writeln(Base64URL.decode("g9cwegE_")); // data
alias Base64URLNoPadding = Base64Impl!('-', '_', '\0');
URLやファイル名で使用しても安全なBase64エンコーディングの@unpaddedのバリエーション。 RFC4648と7515(JWS/JWT/JWE)で使用されている。
利用可能な方法については Base64Implを参照のこと。
Examples:
ubyte[] data = [0x83, 0xd7, 0x30, 0x7b, 0xef];
writeln(Base64URLNoPadding.encode(data)); // "g9cwe-8"
writeln(Base64URLNoPadding.decode("g9cwe-8")); // data
template Base64Impl(char Map62th, char Map63th, char Padding = '=')
Base64エンコードとデコードを実装するためのテンプレート。
ほとんどの場合、このテンプレートを直接使う必要はない、 このモジュールはデフォルトの実装を提供する: Base64代わりに、このモジュールはデフォルトの実装を提供する を実装する Base64URLそして Base64URLNoPadding, で、それぞれURLとファイル名で使用するBase64バリアントを実装する を実装する
カスタマイズされたBase64エンコーディングスキームは、この テンプレートをインスタンス化することで実装できる。例:
// 正規表現に埋め込むための非標準Base64フォーマット。
alias Base64Re = Base64Impl!('!', '=', Base64.NoPadding);

注意 Padding パラメーターが に設定されている場合、エンコードされた文字列はパディングを持たない。 NoPadding に設定されている場合、エンコードされた文字列はパディングを持たない。

Examples:
import std.string : representation;

// 定義済み: alias Base64 = Base64Impl!('+', '/');
ubyte[] emptyArr;
writeln(Base64.encode(emptyArr)); // ""
writeln(Base64.encode("f".representation)); // "Zg=="
writeln(Base64.encode("foo".representation)); // "Zm9v"

alias Base64Re = Base64Impl!('!', '=', Base64.NoPadding);
writeln(Base64Re.encode("f".representation)); // "Zg"
writeln(Base64Re.encode("foo".representation)); // "Zm9v"
enum auto NoPadding;
パディングなしのエンコードを表す
pure nothrow @nogc @safe size_t encodeLength(in size_t sourceLength);
与えられた長さの入力に対応するエンコードされた文字列を格納するのに必要な長さを計算する。 を格納するのに必要な長さを計算する。
Parameters:
size_t sourceLength 入力配列の長さ。
Returns:
指定した長さの配列を Base64 エンコードしたときの長さ。
Examples:
ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e];

// エンコードされた文字列を保持するのに十分な大きさのバッファを確保する。
auto buf = new char[Base64.encodeLength(data.length)];

Base64.encode(data, buf);
writeln(buf); // "Gis8TV1u"
pure @trusted char[] encode(R1, R2)(scope const R1 source, return scope R2 buffer)
if (isArray!R1 && is(ElementType!R1 : ubyte) && is(R2 == char[]));

char[] encode(R1, R2)(R1 source, R2 buffer)
if (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : ubyte) && hasLength!R1 && is(R2 == char[]));
Base64エンコードを使ってソースを char[] バッファにエンコードする。 エンコードする。
Parameters:
R1 source 入力範囲 をエンコードする。
R2 buffer エンコードされた結果を格納するchar[] バッファ。
Returns:
エンコードされた文字列を含むバッファのスライス。
Examples:
ubyte[6] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f];
char[32] buffer;    // 必要以上に大きい

// 念のために言っておくが...
auto encodedLength = Base64.encodeLength(data.length);
assert(buffer.length >= encodedLength);

// encode()は、与えられたバッファへのスライスを返す。
auto encoded = Base64.encode(data[], buffer[]);
assert(encoded is buffer[0 .. encodedLength]);
writeln(encoded); // "g9cwegE/"
size_t encode(E, R)(scope const(E)[] source, auto ref R range)
if (is(E : ubyte) && isOutputRange!(R, char) && !is(R == char[]));

size_t encode(R1, R2)(R1 source, auto ref R2 range)
if (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : ubyte) && hasLength!R1 && !is(R2 == char[]) && isOutputRange!(R2, char));
ソースをエンコードする。 ソースを エンコードする。
Parameters:
const(E)[] source エンコードする入力範囲 をエンコードする。
R range 出力範囲 エンコードされた結果を格納する。
Returns:
出力範囲のput メソッドが呼び出された回数。
Examples:
import std.array : appender;

auto output = appender!string();
ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e];

// このencode()のオーバーロードは、
// 出力範囲のputメソッドの呼び出し回数を返す。
writeln(Base64.encode(data, output)); // 8
writeln(output.data); // "Gis8TV1u"
pure @safe char[] encode(Range)(Range source)
if (isArray!Range && is(ElementType!Range : ubyte));

char[] encode(Range)(Range source)
if (!isArray!Range && isInputRange!Range && is(ElementType!Range : ubyte) && hasLength!Range);
ソースを新しく割り当てられたバッファにエンコードする。
この便利な方法は、出力バッファを手動で管理する必要性を軽減する。 バッファを手動で管理する必要がなくなる。
Parameters:
Range source 入力範囲 をエンコードする。
Returns:
エンコードされた文字列を含む、新しく割り当てられたchar[] バッファ。
Examples:
ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e];
writeln(Base64.encode(data)); // "Gis8TV1u"
struct Encoder(Range) if (isInputRange!Range && (is(ElementType!Range : const(ubyte)[]) || is(ElementType!Range : const(char)[])));
入力範囲 は、データ項目の範囲のそれぞれのBase64エンコーディングを反復する。
この範囲は になる。

注釈: この構造体は、ユーザーコードで直接作成することを意図していない。 この構造体は、ユーザー・コードで直接作成することを意図していない; 代わりに encoder代わりに関数を使用すること。

@property @trusted bool empty();
Returns:
エンコードされたデータが残っていない場合はtrueを返す。
nothrow @property @safe char[] front();
Returns:
エンコードされたデータの現在のチャンク。
void popFront();
エンコードされたデータの次のチャンクまで範囲を進める。
Throws:
Base64Exception のときに呼び出された場合 empty`は を返す。true
@property typeof(this) save();
範囲の現在の繰り返し状態を保存する。
このメソッドは、基礎となる範囲が ある場合にのみ利用できる。
Returns:
this のコピーである。
struct Encoder(Range) if (isInputRange!Range && is(ElementType!Range : ubyte));
入力範囲。 与えられたソース・データのエンコードされたバイトを反復する入力範囲。
入力範囲は になる。

注釈: この構造体は、ユーザーコードで直接作成することは意図されていない。 この構造体は、ユーザーコードで直接作成することを意図していない; 代わりに encoder代わりに関数を使用すること。

const nothrow @property @safe bool empty();
Returns:
イテレートすべきエンコードされた文字がなくなった場合はtrueを返す。
nothrow @property @safe ubyte front();
Returns:
現在エンコードされている文字。
void popFront();
次のエンコード文字に進む。
Throws:
Base64Exception empty`のときに呼び出されると、 を返す。true
@property typeof(this) save();
範囲の現在の反復状態を保存する。
このメソッドは、基礎となる範囲が ある場合にのみ使用できる。
Returns:
this のコピーである。
Encoder!Range encoder(Range)(Range range)
if (isInputRange!Range);
与えられた入力範囲のBase64エンコーディングを反復処理するEncoder を構築する。 Base64エンコーディングを反復処理する を構築する。
Parameters:
Range range 入力範囲 エンコードされるデータの
Returns:
rangeがバイト範囲である場合は、対応するBase64エンコーディングのバイトを繰り返し処理するEncoder 。 をイテレートする。
rangeがバイト範囲の範囲である場合、Encoder 。 範囲の各要素のBase64エンコード文字列を反復処理する。
どちらの場合も、返されるEncoder前方範囲である。 与えられた rangeが少なくとも前方範囲であれば前方範囲となる。 になる。

例: この例では、入力を1行ずつエンコードする。

File f = File("text.txt", "r");
scope(exit) f.close();

uint line = 0;
foreach (encoded; Base64.encoder(f.byLine()))
{
    writeln(++line, ". ", encoded);
}

例: この例では、入力データを1バイトずつエンコードする。

ubyte[] data = cast(ubyte[]) "0123456789";

// データのElementTypeが集約型ではない
foreach (encoded; Base64.encoder(data))
{
    writeln(encoded);
}

pure nothrow @nogc @safe size_t decodeLength(in size_t sourceLength);
Base64エンコードされた文字列が与えられると、デコードされた文字列の長さを計算する。 文字列の長さを計算する。
Parameters:
size_t sourceLength Base64エンコーディングの長さ。
Returns:
のBase64エンコーディングに対応する、デコードされた文字列の長さ。 長さsourceLength に対応するデコード文字列の長さ。
Examples:
auto encoded = "Gis8TV1u";

// デコードされた結果を保持するのに十分な大きさのバッファを確保する。
auto buffer = new ubyte[Base64.decodeLength(encoded.length)];

Base64.decode(encoded, buffer);
writeln(buffer); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
pure @trusted ubyte[] decode(R1, R2)(in R1 source, return scope R2 buffer)
if (isArray!R1 && is(ElementType!R1 : dchar) && is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));

ubyte[] decode(R1, R2)(R1 source, R2 buffer)
if (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : dchar) && hasLength!R1 && is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));
ソースを与えられたバッファにデコードする。
Parameters:
R1 source 入力範囲 をデコードする。
R2 buffer デコード結果を格納するバッファ。
Returns:
デコード結果を格納するバッファのスライス。
Throws:
Base64Exception ソースに 現在のBase64エンコーディングスキームの基本アルファベット以外の文字がソースに含まれている。
Examples:
auto encoded = "Gis8TV1u";
ubyte[32] buffer;   // 必要以上に大きい

// 念のために言っておくが...
auto decodedLength = Base64.decodeLength(encoded.length);
assert(buffer.length >= decodedLength);

// decode()は与えられたバッファのスライスを返す。
auto decoded = Base64.decode(encoded, buffer[]);
assert(decoded is buffer[0 .. decodedLength]);
writeln(decoded); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
size_t decode(R1, R2)(in R1 source, auto ref R2 range)
if (isArray!R1 && is(ElementType!R1 : dchar) && !is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));

size_t decode(R1, R2)(R1 source, auto ref R2 range)
if (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : dchar) && hasLength!R1 && !is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));
ソースを所定の出力範囲にデコードする。 出力範囲にデコードする。
Parameters:
R1 source 入力範囲 をデコードする。
R2 range 出力範囲 デコード結果を格納する。
Returns:
出力範囲のput メソッドが呼び出された回数。
Throws:
Base64Exception ソースに 現在のBase64エンコーディングスキームの基本アルファベット以外の文字がソースに含まれている。
Examples:
struct OutputRange
{
    ubyte[] result;
    void put(ubyte b) { result ~= b; }
}
OutputRange output;

// このdecode()のオーバーロードは、put()の呼び出し回数を返す。
writeln(Base64.decode("Gis8TV1u", output)); // 6
writeln(output.result); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
pure @safe ubyte[] decode(Range)(Range source)
if (isArray!Range && is(ElementType!Range : dchar));

ubyte[] decode(Range)(Range source)
if (!isArray!Range && isInputRange!Range && is(ElementType!Range : dchar) && hasLength!Range);
ソースを新しく割り当てられたバッファにデコードする。
この便利な方法により、デコード・バッファを手動で管理する必要がなくなる。 バッファを手動で管理する必要がなくなる。
Parameters:
Range source 入力範囲 をデコードする。
Returns:
デコードされた文字列を含む、新しく割り当てられたubyte[] バッファ。
Examples:
auto data = "Gis8TV1u";
writeln(Base64.decode(data)); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
struct Decoder(Range) if (isInputRange!Range && (is(ElementType!Range : const(char)[]) || is(ElementType!Range : const(ubyte)[])));
入力範囲 は、Base64エンコーディングのデコードされたデータを反復処理する。
この範囲は になる。

注釈: この構造体は、ユーザーコードで直接作成することを意図していない。 この構造体は、ユーザー・コードで直接作成することを意図していない; 代わりに decoder代わりに関数を使用すること。

@property @trusted bool empty();
Returns:
イテレートする要素がなくなった場合はtrueを返す。
nothrow @property @safe ubyte[] front();
Returns:
入力中の現在の要素をデコードする。
void popFront();
デコードする入力の次の要素に進む。
Throws:
Base64Exception empty`のときに呼び出された場合は、 を返す。true
@property typeof(this) save();
現在の反復処理の状態を保存する。
このメソッドは、基礎となる範囲が 前方範囲
Returns:
this のコピーである。
struct Decoder(Range) if (isInputRange!Range && is(ElementType!Range : char));
入力範囲。 Base64エンコードされた文字列からデコードされたデータのバイトを反復処理する。
この範囲は になる。

注釈: この構造体は、ユーザーコードで直接作成することを意図していない。 この構造体は、ユーザー・コードで直接作成することを意図していない; 代わりに decoder代わりに関数を使用すること。

const nothrow @property @safe bool empty();
Returns:
イテレートする要素がなくなった場合はtrueを返す。
nothrow @property @safe ubyte front();
Returns:
現在デコードされているバイト。
void popFront();
次のデコードバイトに進む。
Throws:
Base64Exception empty`のときに呼び出された場合、 を返す。true
@property typeof(this) save();
現在の反復処理の状態を保存する。
このメソッドは、基礎となる範囲が 前方範囲
Returns:
this のコピーである。
Decoder!Range decoder(Range)(Range range)
if (isInputRange!Range);

Decoder!(const(ubyte)[]) decoder()(const(char)[] range);
与えられたBase64エンコードされたデータのデコードを繰り返すDecoder 。 を構築する。
Parameters:
Range range 入力範囲 またはchar 配列。を受け付けない。 wchar[] dchar[] も受け付けない。
Returns:
rangeが char の範囲または配列の場合、Decoder 。 は、対応するBase64デコードのバイトを反復する。
rangeが文字の範囲の範囲であればDecoder の各要素に対応するデコード文字列を反復処理する。 を返す。
どちらの場合も、返されるDecoder前方範囲となる。 与えられた rangeが少なくとも前方範囲であれば前方範囲となる。 になる。
入力データに、現在のBase64エンコーディングスキームの基本アルファベットにない文字が含まれている場合 をスローすることがある。 Base64Exception.

例: この例は、入力データ・ラインの範囲にわたるデコードを示している。

foreach (decoded; Base64.decoder(stdin.byLine()))
{
    writeln(decoded);
}
この例では1バイトずつデコードしている。
auto encoded = Base64.encoder(cast(ubyte[])"0123456789");
foreach (n; map!q{a - '0'}(Base64.decoder(encoded)))
{
    writeln(n);
}

Examples:
import std.algorithm.comparison : equal;
string encoded =
    "VGhvdSBzaGFsdCBuZXZlciBjb250aW51ZSBhZnRlciBhc3NlcnRpbmcgbnVsbA==";

assert(Base64.decoder(encoded)
    .equal("Thou shalt never continue after asserting null"));
class Base64Exception: object.Exception;
Base64エンコードまたはデコードエラーが発生したときにスローされる例外。
Examples:
import std.exception : assertThrown;
assertThrown!Base64Exception(Base64.decode("ab|c"));