DoxigAlpha

encode

Encodes a binary buffer into a base64 string. The output buffer must be at least encodedLen(bin.len) bytes long.

Function parameters

Parameters

#
encoded:[]u8
bin:[]const u8

(best-effort) constant time hexadecimal encoding and decoding.

Types

#
hex
(best-effort) constant time hexadecimal encoding and decoding.
base64
(best-effort) constant time base64 encoding and decoding.

Error sets in this namespace

Error Sets

#

Source

Implementation

#
pub fn encode(encoded: []u8, bin: []const u8, comptime variant: Variant) error{NoSpaceLeft}![]const u8 {
    var acc_len: u4 = 0;
    var b64_pos: usize = 0;
    var acc: u16 = 0;
    const nibbles = bin.len / 3;
    const remainder = bin.len - 3 * nibbles;
    var b64_len = nibbles * 4;
    if (remainder != 0) {
        b64_len += if (variant.padding) 4 else 2 + (remainder >> 1);
    }
    if (encoded.len < b64_len) {
        return error.NoSpaceLeft;
    }
    const urlsafe = variant.urlsafe_alphabet;
    for (bin) |v| {
        acc = (acc << 8) + v;
        acc_len += 8;
        while (acc_len >= 6) {
            acc_len -= 6;
            encoded[b64_pos] = charFromByte(@as(u6, @truncate(acc >> acc_len)), urlsafe);
            b64_pos += 1;
        }
    }
    if (acc_len > 0) {
        encoded[b64_pos] = charFromByte(@as(u6, @truncate(acc << (6 - acc_len))), urlsafe);
        b64_pos += 1;
    }
    while (b64_pos < b64_len) {
        encoded[b64_pos] = '=';
        b64_pos += 1;
    }
    return encoded[0..b64_pos];
}