std.base64
Поддержка кодирования и декодирования Base64.
Этот модуль предоставляет две стандартные реализации кодирования Base64, Base64 с стандартным алфавитом кодирования, и варианта Base64URL, который использует изменённый алфавит кодирования, предназначенный для безопасного использования в URL и именах файлов.
Оба варианта реализованы как экземпляры шаблона Base64Impl. Большинству пользователей не нужно использовать этот шаблон напрямую; однако, его можно использовать для создания настраиваемых схем кодирования 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 диапазонов для кодирования и декодирования: - Пример
// Create MIME Base64 with CRLF, per line 76.
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);
- Ссылки
- RFC 4648 - Кодирования данных Base16, Base32 и Base64
- Лицензия:
- Лицензия Boost 1.0.
- Авторы:
- Masahiro Nakagawa, Daniel Murphy (Кодировщик и декодировщик для единственного значения)
- Исходный код
- std/base64.d
- alias Base64 = Base64Impl!('+', '/', '=');
-
Реализация стандартного кодирования Base64.
См.
Base64Implдля описания доступных методов.- Примеры:
-
ubyte[] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f]; writeln(Base64.encode(data)); // "g9cwegE/" writeln(Base64.decode("g9cwegE/")); // data
- alias Base64URL = Base64Impl!('-', '_', '=');
-
Вариант кодирования Base64, безопасный для использования в URL и именах файлов.
См.
Base64Implдля описания доступных методов.- Примеры:
-
ubyte[] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f]; writeln(Base64URL.encode(data)); // "g9cwegE_" writeln(Base64URL.decode("g9cwegE_")); // data
- alias Base64URLNoPadding = Base64Impl!('-', '_', '\x00');
-
Вариант кодирования Base64 без заполнения, безопасный для использования в URL и именах файлов, как используется в RFC 4648 и 7515 (JWS/JWT/JWE).
См.
Base64Implдля описания доступных методов.- Примеры:
-
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, реализующую базовое кодирование Base64, иBase64URLиBase64URLNoPadding, реализующие варианты Base64 для использования в URL и именах файлов, с и без заполнения соответственно.
Настраиваемые схемы кодирования Base64 можно реализовать, инициализировав этот шаблон соответствующими аргументами. Например:
// Non-standard Base64 format for embedding in regular expressions. alias Base64Re = Base64Impl!('!', '=', Base64.NoPadding);- ПРИМЕЧАНИЕ
- Строки, закодированные с помощью Base64, не будут содержать символов заполнения, если параметр
Paddingустановлен наNoPadding.
- Примеры:
-
import std.string : representation; // pre-defined: 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"
- перечисление auto NoPadding;
-
представляет кодирование без заполнения
- чистое без исключений @safe size_t encodeLength(in size_t sourceLength);
-
Вычисляет длину, необходимую для хранения закодированной строки, соответствующей вводу заданной длины.
- Параметры:
size_t sourceLengthДлина исходного массива.
- Возвращает:
- Длина Base64 кодирования массива заданной длины.
- Примеры:
-
ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]; // Allocate a buffer large enough to hold the encoded string. auto buf = new char[Base64.encodeLength(data.length)]; Base64.encode(data, buf); writeln(buf); // "Gis8TV1u"
- чистое @trusted char[] encode(R1, R2)(in R1 source, R2 buffer)
Ограничения: если (isArray!R1 && is(ElementType!R1 : ubyte) && is(R2 == char[]));
char[] encode(R1, R2)(R1 source, R2 buffer)
Ограничения: если (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : ubyte) && hasLength!R1 && is(R2 == char[])); -
Кодирует source в
char[]буфер с использованием Base64 кодирования.- Параметры:
R1 sourceВходной диапазон для кодирования. R2 bufferchar[]буфер для хранения закодированного результата.
- Возвращает:
- Срез buffer, содержащий закодированную строку.
- Примеры:
-
ubyte[] data = [0x83, 0xd7, 0x30, 0x7a, 0x01, 0x3f]; char[32] buffer; // much bigger than necessary // Just to be sure... auto encodedLength = Base64.encodeLength(data.length); assert(buffer.length >= encodedLength); // encode() returns a slice to the provided buffer. 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)
Ограничения: если (is(E : ubyte) && isOutputRange!(R, char) && !is(R == char[]));
size_t encode(R1, R2)(R1 source, auto ref R2 range)
Ограничения: если (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : ubyte) && hasLength!R1 && !is(R2 == char[]) && isOutputRange!(R2, char)); -
Кодирует source в выходной диапазон с использованием Base64 кодирования.
- Параметры:
const(E)[] sourceВходной диапазон для кодирования. R rangeВыходной диапазон для хранения закодированного результата.
- Возвращает:
- Количество вызовов метода
putвыходного диапазона.
- Примеры:
-
import std.array : appender; auto output = appender!string(); ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]; // This overload of encode() returns the number of calls to the output // range's put method. writeln(Base64.encode(data, output)); // 8 writeln(output.data); // "Gis8TV1u"
- чистое @safe char[] encode(Range)(Range source)
Ограничения: если (isArray!Range && is(ElementType!Range : ubyte));
char[] encode(Range)(Range source)
Ограничения: если (!isArray!Range && isInputRange!Range && is(ElementType!Range : ubyte) && hasLength!Range); -
Кодирует source в новый выделенный буфер.
Этот вспомогательный метод избавляет от необходимости вручную управлять выходными буферами.
- Параметры:
Range sourceВходной диапазон для кодирования.
- Возвращает:
- Новый выделенный
char[]буфер, содержащий закодированную строку.
- Примеры:
-
ubyte[] data = [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]; writeln(Base64.encode(data)); // "Gis8TV1u"
- структура Encoder(Range) если (isInputRange!Range && (is(ElementType!Range : const(ubyte)[]) || is(ElementType!Range : const(char)[])));
-
Входной диапазон, который итерируется по соответствующим Base64 кодированиям элементов данных из диапазона.
Этот диапазон будет прямолинейным, если исходный источник данных по крайней мере прямолинейный.
- Примечание
- Эта структура не предназначена для непосредственного создания в коде пользователя; используйте функцию
encoderвместо этого.
- @property @trusted bool empty();
-
- Возвращает:
- true, если больше нет закодированных данных.
- без исключений @property @safe char[] front();
-
- Возвращает:
- Текущий фрагмент закодированных данных.
- void popFront();
-
Перемещает диапазон к следующему фрагменту закодированных данных.
- Выбрасывает:
-
Base64ExceptionЕсли вызван, когда `empty` возвращаетtrue.
- @property typeof(this) save();
-
Сохранить текущее состояние итерации диапазона.
Этот метод доступен только если базовый диапазон является прямолинейным.
- Возвращает:
- Копию
this.
- структура Encoder(Range) если (isInputRange!Range && is(ElementType!Range : ubyte));
-
Входной диапазон, который итерируется по закодированным байтам заданных данных.
Это будет прямолинейный диапазон, если исходный источник данных по крайней мере прямолинейный.
- Примечание
- Эта структура не предназначена для непосредственного создания в коде пользователя; используйте функцию
encoderвместо этого.
- const без исключений @property @safe bool empty();
-
- Возвращает:
- true, если больше нет закодированных символов для итерации.
- без исключений @property @safe ubyte front();
-
- Возвращает:
- Текущий закодированный символ.
- void popFront();
-
Переход к следующему закодированному символу.
- Выбрасывает:
-
Base64ExceptionЕсли вызван, когда ` empty` возвращаетtrue.
- @property typeof(this) save();
-
Сохранить текущее состояние итерации диапазона.
Этот метод доступен только если базовый диапазон является прямолинейным.
- Возвращает:
- Копию
this.
- Encoder!Range encoder(Range)(Range range)
Ограничения: если (isInputRange!Range); -
Создаёт
Encoder, который итерируется по Base64 кодированию данного входного диапазона.- Параметры:
Range rangeВходной диапазон данных, подлежащих кодированию.
- Возвращает:
- Если range — это диапазон байтов,
Encoder, который итерируется по байтам соответствующего Base64 кодирования. Если range — это диапазон диапазонов байтов,Encoder, который итерируется по Base64 закодированным строкам каждого элемента диапазона. В обоих случаях возвращённыйEncoderбудет прямолинейным, если заданныйrangeпо крайней мере прямолинейный, в противном случае он будет только входным диапазоном.
- Пример
- В этом примере кодирование входных данных выполняется построчно.
File f = File("text.txt", "r"); scope(exit) f.close(); uint line = 0; foreach (encoded; Base64.encoder(f.byLine())) { writeln(++line, ". ", encoded); }- Пример
- В этом примере кодирование входных данных выполняется побайтово.
ubyte[] data = cast(ubyte[]) "0123456789"; // The ElementType of data is not aggregation type foreach (encoded; Base64.encoder(data)) { writeln(encoded); } - чистое без исключений @safe size_t decodeLength(in size_t sourceLength);
-
Для Base64 закодированной строки вычисляет длину декодированной строки.
- Параметры:
size_t sourceLengthДлина Base64 кодирования.
- Возвращает:
- Длина декодированной строки, соответствующей Base64 кодированию длины sourceLength.
- Примеры:
-
auto encoded = "Gis8TV1u"; // Allocate a sufficiently large buffer to hold to decoded result. auto buffer = new ubyte[Base64.decodeLength(encoded.length)]; Base64.decode(encoded, buffer); writeln(buffer); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
- чистое @trusted ubyte[] decode(R1, R2)(in R1 source, R2 buffer)
Ограничения: если (isArray!R1 && is(ElementType!R1 : dchar) && is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));
ubyte[] decode(R1, R2)(R1 source, R2 buffer)
Ограничения: если (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : dchar) && hasLength!R1 && is(R2 == ubyte[]) && isOutputRange!(R2, ubyte)); -
Декодирует source в данный буфер.
- Параметры:
R1 sourceВходной диапазон для декодирования. R2 bufferБуфер для хранения декодированного результата.
- Возвращает:
- Срез buffer, содержащий декодированный результат.
- Выбрасывает:
-
Base64Exceptionесли source содержит символы вне базового алфавита текущей схемы Base64 кодирования.
- Примеры:
-
auto encoded = "Gis8TV1u"; ubyte[32] buffer; // much bigger than necessary // Just to be sure... auto decodedLength = Base64.decodeLength(encoded.length); assert(buffer.length >= decodedLength); // decode() returns a slice of the given buffer. 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)
Ограничения: если (isArray!R1 && is(ElementType!R1 : dchar) && !is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));
size_t decode(R1, R2)(R1 source, auto ref R2 range)
Ограничения: если (!isArray!R1 && isInputRange!R1 && is(ElementType!R1 : dchar) && hasLength!R1 && !is(R2 == ubyte[]) && isOutputRange!(R2, ubyte));
-
Декодирует source в заданный диапазон вывода.
- Параметры:
R1 sourceДиапазон ввода для декодирования. R2 rangeДиапазон вывода для хранения результата декодирования.
- Возвращает:
- Количество раз, когда метод
putдиапазона вывода был вызван.
- Исключения:
-
Base64Exceptionесли source содержит символы, не входящие в базовый алфавит текущей схемы кодирования Base64.
- Примеры:
-
struct OutputRange { ubyte[] result; void put(ubyte b) { result ~= b; } } OutputRange output; // This overload of decode() returns the number of calls to put(). writeln(Base64.decode("Gis8TV1u", output)); // 6 writeln(output.result); // [0x1a, 0x2b, 0x3c, 0x4d, 0x5d, 0x6e]
- pure @safe ubyte[] decode(Range)(Range source)
Constraints: if (isArray!Range && is(ElementType!Range : dchar));
ubyte[] decode(Range)(Range source)
Constraints: if (!isArray!Range && isInputRange!Range && is(ElementType!Range : dchar) && hasLength!Range); -
Декодирует source в буфер с новым выделением памяти.
Этот удобный метод избавляет от необходимости вручную управлять буферами декодирования.
- Параметры:
Range sourceДиапазон ввода для декодирования.
- Возвращает:
- Буфер с новым выделением памяти
ubyte[], содержащий декодированную строку.
- Примеры:
-
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();
-
- Возвращает:
- true, если больше нет элементов для итерации.
- nothrow @property @safe ubyte[] front();
-
- Возвращает:
- Декодирование текущего элемента ввода.
- void popFront();
-
Переход к следующему элементу ввода для декодирования.
- Исключения:
-
Base64Exceptionесли вызван, когда ` empty` возвращаетtrue.
- @property typeof(this) save();
-
Сохранение текущего состояния итерации.
Этот метод доступен только если базовый диапазон — диапазон вперёд.
- Возвращает:
- Копию
this.
- struct Decoder(Range) if (isInputRange!Range && is(ElementType!Range : char));
-
Диапазон ввода, который итерируется по байтам данных, декодированных из Base64 закодированной строки.
Этот диапазон будет диапазоном вперёд, если исходный источник данных — по крайней мере, диапазон вперёд.
- Примечание
- Данный структуру не предназначено создавать напрямую в коде пользователя; используйте функцию
decoderвместо этого.
- const nothrow @property @safe bool empty();
-
- Возвращает:
- true, если больше нет элементов для итерации.
- nothrow @property @safe ubyte front();
-
- Возвращает:
- Текущий декодированный байт.
- void popFront();
-
Переход к следующему декодированному байту.
- Исключения:
-
Base64Exceptionесли вызван, когда ` empty` возвращаетtrue.
- @property typeof(this) save();
-
Сохранение текущего состояния итерации.
Этот метод доступен только если базовый диапазон — диапазон вперёд.
- Возвращает:
- Копию
this.
- Decoder!Range decoder(Range)(Range range)
Constraints: if (isInputRange!Range); -
Конструирует
Decoder, который итерируется по декодированию заданных данных Base64.- Параметры:
Range rangeДиапазон ввода над данными, подлежащими декодированию.
- Возвращает:
- Если range — диапазон символов, a
Decoder, который итерируется по байтам соответствующего Base64 декодирования. Если range — диапазон диапазонов символов, aDecoder, который итерируется по декодированным строкам, соответствующим каждому элементу диапазона. В этом случае длина каждого поддиапазона должна быть кратна 4; возвращаемый декодер не отслеживает состояние декодирования Base64 между границами поддиапазонов. В обоих случаях возвращаемыйDecoderбудет диапазоном вперёд, если заданныйrange— по крайней мере, диапазон вперёд, в противном случае он будет только диапазоном ввода. Если входные данные содержат символы, отсутствующие в базовом алфавите текущей схемы кодирования Base64, возвращаемый диапазон может выброситьBase64Exception.
- Пример
- Этот пример демонстрирует декодирование по диапазону строк входных данных.
foreach (decoded; Base64.decoder(stdin.byLine())) { writeln(decoded); }- Пример
- Этот пример демонстрирует декодирование по одному байту за раз.
auto encoded = Base64.encoder(cast(ubyte[])"0123456789"); foreach (n; map!q{a - '0'}(Base64.decoder(encoded))) { writeln(n); }
-
- class Base64Exception: object.Exception;
-
Исключение, выбрасываемое при обнаружении ошибок кодирования или декодирования Base64.
- Примеры:
-
import std.exception : assertThrown; assertThrown!Base64Exception(Base64.decode("ab|c"));
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_base64.html