core :: CString :: encode_base64
self
to base64.By default, uses "=" for padding.
assert "string".encode_base64 == "c3RyaW5n"
# Encodes `self` to base64.
#
# By default, uses "=" for padding.
#
# assert "string".encode_base64 == "c3RyaW5n"
private fun encode_base64(length: Int): Bytes do
var base64_bytes = once base64_chars
var steps = length / 3
var bytes_in_last_step = length % 3
var result_length = steps * 4
if bytes_in_last_step > 0 then result_length += 4
var result = new Bytes.with_capacity(result_length)
var in_off = 0
for s in [0 .. steps[ do
var ind = (self[in_off] & 0b1111_1100) >> 2
result.add base64_bytes[ind]
ind = ((self[in_off] & 0b0000_0011) << 4) | ((self[in_off + 1] & 0b1111_0000) >> 4)
result.add base64_bytes[ind]
ind = ((self[in_off + 1] & 0b0000_1111) << 2) | ((self[in_off + 2] & 0b1100_0000) >> 6)
result.add base64_bytes[ind]
ind = (self[in_off + 2] & 0b0011_1111)
result.add base64_bytes[ind]
in_off += 3
end
if bytes_in_last_step == 1 then
result.add base64_bytes[(self[in_off] & 0b1111_1100) >> 2]
result.add base64_bytes[(self[in_off] & 0b0000_0011) << 4]
else if bytes_in_last_step == 2 then
result.add base64_bytes[(self[in_off] & 0b1111_1100) >> 2]
result.add base64_bytes[((self[in_off] & 0b0000_0011) << 4) | ((self[in_off + 1] & 0b1111_0000) >> 4)]
result.add base64_bytes[(self[in_off + 1] & 0b0000_1111) << 2]
end
var rempad = if bytes_in_last_step > 0 then 3 - bytes_in_last_step else 0
for i in [0 .. rempad[ do result.add u'='
return result
end
lib/base64/base64.nit:67,2--104,4