do
var inv_base64_chars = new HashMap[Char,Int]
for k in [0..base64_chars.length[ do
- inv_base64_chars[ base64_chars[k] ] = k
+ inv_base64_chars[ base64_chars.chars[k] ] = k
end
return inv_base64_chars
end
# Encodes the receiver string to base64.
# By default, uses "=" for padding.
fun encode_base64 : String do return encode_base64_custom_padding( '=' )
+
+ # Encodes the receiver string to base64 using a custom padding character.
+ #
+ # If using the default padding character `=`, see `encode_base64`.
fun encode_base64_custom_padding( padding : Char ) : String
do
var base64_chars = once base64_chars
for s in [0..steps[ do
var e = 0
for ss in [0..3[ do
- e += self[s*3+ss].ascii.lshift((2-ss)*8)
+ e += self.chars[s*3+ss].ascii.lshift((2-ss)*8)
end
for ss in [0..4[ do
- result[s*4+3-ss] = base64_chars[ e.rshift(ss*6).bin_and( mask_6bit ) ]
+ result[s*4+3-ss] = base64_chars.chars[ e.rshift(ss*6).bin_and( mask_6bit ) ]
end
end
if chars_in_last_step == 1 then
- var e = self[length-1].ascii.lshift(16)
+ var e = self.chars[length-1].ascii.lshift(16)
for ss in [0..2[ do
- result[steps*4+1-ss] = base64_chars[ e.rshift((ss+2)*6).bin_and( mask_6bit ) ]
+ result[steps*4+1-ss] = base64_chars.chars[ e.rshift((ss+2)*6).bin_and( mask_6bit ) ]
end
else if chars_in_last_step == 2 then
- var e = self[length-2].ascii.lshift(16) +
- self[length-1].ascii.lshift(8)
+ var e = self.chars[length-2].ascii.lshift(16) +
+ self.chars[length-1].ascii.lshift(8)
for ss in [0..3[ do
- result[steps*4+2-ss] = base64_chars[ e.rshift((ss+1)*6).bin_and( mask_6bit ) ]
+ result[steps*4+2-ss] = base64_chars.chars[ e.rshift((ss+1)*6).bin_and( mask_6bit ) ]
end
end
- return new String.from_cstring( result )
+ return result.to_s
end
# Decodes the receiver string from base64.
# By default, uses "=" for padding.
fun decode_base64 : String do return decode_base64_custom_padding( '=' )
+
+ # Decodes the receiver string to base64 using a custom padding character.
+ #
+ # If using the default padding character `=`, see `decode_base64`.
fun decode_base64_custom_padding( padding : Char ) : String
do
var inverted_base64_chars = once inverted_base64_chars
var steps = length / 4
var result_length = steps*3
- var padding_begin = padding.search_index_in( self, 0 )
+ var padding_begin = self.search(padding)
var padding_count : Int
- if padding_begin == -1 then
+ if padding_begin == null then
padding_count = 0
else
- padding_count = length - padding_begin
+ padding_count = length - padding_begin.from
steps -= 1
result_length -= padding_count
end
for s in [0..steps[ do
var e = 0
for ss in [0..4[ do
- e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6)
+ e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6)
end
for ss in [0..3[ do
if padding_count == 1 then
var e = 0
for ss in [0..3[ do
- e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6)
+ e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6)
end
for ss in [0..2[ do
else if padding_count == 2 then
var e = 0
for ss in [0..2[ do
- e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6)
+ e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6)
end
result[s*3] = e.rshift(2*8).bin_and( mask_8bit ).ascii
end
- return new String.from_cstring( result )
+ return result.to_s
end
end