DoxigAlpha

encode

dest.len must at least be what you get from ::calcSize.

Function parameters

Parameters

#
encoder:*const Base64Encoder
dest:[]u8
source:[]const u8

Base64 codecs

Types

#
Codecs
Base64 codecs

Error sets in this namespace

Error Sets

#

The Base64 alphabet defined in

Values

#
standard_alphabet_chars
The Base64 alphabet defined in
standard
Standard Base64 codecs, with padding, as defined in
standard_no_pad
Standard Base64 codecs, without padding, as defined in
url_safe_alphabet_chars
The URL-safe Base64 alphabet defined in
url_safe
URL-safe Base64 codecs, with padding, as defined in
url_safe_no_pad
URL-safe Base64 codecs, without padding, as defined in

Source

Implementation

#
pub fn encode(encoder: *const Base64Encoder, dest: []u8, source: []const u8) []const u8 {
    const out_len = encoder.calcSize(source.len);
    assert(dest.len >= out_len);

    var idx: usize = 0;
    var out_idx: usize = 0;
    while (idx + 15 < source.len) : (idx += 12) {
        const bits = std.mem.readInt(u128, source[idx..][0..16], .big);
        inline for (0..16) |i| {
            dest[out_idx + i] = encoder.alphabet_chars[@truncate((bits >> (122 - i * 6)) & 0x3f)];
        }
        out_idx += 16;
    }
    while (idx + 3 < source.len) : (idx += 3) {
        const bits = std.mem.readInt(u32, source[idx..][0..4], .big);
        dest[out_idx] = encoder.alphabet_chars[(bits >> 26) & 0x3f];
        dest[out_idx + 1] = encoder.alphabet_chars[(bits >> 20) & 0x3f];
        dest[out_idx + 2] = encoder.alphabet_chars[(bits >> 14) & 0x3f];
        dest[out_idx + 3] = encoder.alphabet_chars[(bits >> 8) & 0x3f];
        out_idx += 4;
    }
    if (idx + 2 < source.len) {
        dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2];
        dest[out_idx + 1] = encoder.alphabet_chars[((source[idx] & 0x3) << 4) | (source[idx + 1] >> 4)];
        dest[out_idx + 2] = encoder.alphabet_chars[(source[idx + 1] & 0xf) << 2 | (source[idx + 2] >> 6)];
        dest[out_idx + 3] = encoder.alphabet_chars[source[idx + 2] & 0x3f];
        out_idx += 4;
    } else if (idx + 1 < source.len) {
        dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2];
        dest[out_idx + 1] = encoder.alphabet_chars[((source[idx] & 0x3) << 4) | (source[idx + 1] >> 4)];
        dest[out_idx + 2] = encoder.alphabet_chars[(source[idx + 1] & 0xf) << 2];
        out_idx += 3;
    } else if (idx < source.len) {
        dest[out_idx] = encoder.alphabet_chars[source[idx] >> 2];
        dest[out_idx + 1] = encoder.alphabet_chars[(source[idx] & 0x3) << 4];
        out_idx += 2;
    }
    if (encoder.pad_char) |pad_char| {
        for (dest[out_idx..out_len]) |*pad| {
            pad.* = pad_char;
        }
    }
    return dest[0..out_len];
}