Function encode [src]

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

Prototype

pub fn encode(encoder: *const Base64Encoder, dest: []u8, source: []const u8) []const u8

Parameters

encoder: *const Base64Encoderdest: []u8source: []const u8

Source

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]; }