module Base24
Constants
- ALPHABET
- ASIZE
- DECODE_MAP
- ENCODE_MAP
- VERSION
Public Class Methods
decode24(data)
click to toggle source
# File lib/base24.rb, line 27 def self.decode24(data) raise "Data size must be multiple of 7" if data.size % 7 != 0 data.chars.each_slice(7).reduce([]) do |result, chars| value = chars.reduce(0) do |value, char| idx = DECODE_MAP[char] raise "Invalid character" if idx.nil? value * ASIZE + idx end mask = 0xFF b0 = (value & (mask << 24)) >> 24 b1 = (value & (mask << 16)) >> 16 b2 = (value & (mask << 8)) >> 8 b3 = value & mask result + [b0, b1, b2, b3] end.pack('C*') end
encode24(data)
click to toggle source
# File lib/base24.rb, line 6 def self.encode24(data) raise "Data size must be multiple of 4" if data.size % 4 != 0 data.unpack('C*').each_slice(4).reduce([]) do |result, slice| b0, b1, b2, b3 = slice value = b0 << 24 | b1 << 16 | b2 << 8 | b3 sub_result, value = (0..6).reduce([[], value]) do |acc, i| res, value = acc idx = value % ASIZE value = value / ASIZE char = ENCODE_MAP[idx] [[char] + res, value] end result + sub_result end.join end
Private Class Methods
decode_map()
click to toggle source
# File lib/base24.rb, line 57 def self.decode_map() ALPHABET.chars.reduce([{}, 0]) do |acc, char| map, idx = acc map[char] = idx map[char.downcase] = idx [map, idx + 1] end[0] end
encode_map()
click to toggle source
# File lib/base24.rb, line 49 def self.encode_map() ALPHABET.chars.reduce([{}, 0]) do |acc, char| map, idx = acc map[idx] = char [map, idx + 1] end[0] end