class AltCharacters::AltBase
Constants
- BYTE
Public Class Methods
new(length, characters: nil, padding_character: '=')
click to toggle source
# File lib/alt_characters/alt_base.rb, line 10 def initialize(length, characters: nil, padding_character: '=') @length = length @padding_character = padding_character @logarithm = Math.log2(length).to_i # 2**n @characters = characters @characters = characters.split(//) if characters.class == String count = @characters.count raise EncodableCharactersError, "Not enough characters. #{count} characters specified" if count < length warn "[warn] Too many characters specified. The last #{count - length} characters are not used" if count > length end
Public Instance Methods
decode(encoded_text, padding: false)
click to toggle source
rubocop:enable Metrics/AbcSize
# File lib/alt_characters/alt_base.rb, line 36 def decode(encoded_text, padding: false) binary = '' encoded_text.to_s.chars.each do |character| break if padding && character == @padding_character i = @characters.index(character) raise DecodeError, "character(#{character}) does not exists" if i.nil? binary += format("%0#{@logarithm}d", i.to_s(2)) end string = [binary].pack('B*') # string.encoding # => ASCII-8BIT string.force_encoding('UTF-8').delete("\x00") end
encode(text, padding: false)
click to toggle source
rubocop:disable Metrics/AbcSize
# File lib/alt_characters/alt_base.rb, line 23 def encode(text, padding: false) binary = text.to_s.unpack1('B*') encoded_characters = binary.chars.each_slice(@logarithm).map do |chunk| chunk << '0' * (@logarithm - chunk.count) if chunk.count < @logarithm i = chunk.join.to_i(2) @characters[i] end encoded_characters = add_padding(encoded_characters) if padding && need_padding?(encoded_characters) encoded_characters.join end
Private Instance Methods
add_padding(characters)
click to toggle source
# File lib/alt_characters/alt_base.rb, line 63 def add_padding(characters) missing_chunks(characters).times do characters << @padding_character end characters end
missing_chunks(characters)
click to toggle source
# File lib/alt_characters/alt_base.rb, line 53 def missing_chunks(characters) number_of_group_characters = @logarithm.lcm(BYTE) / @logarithm modulo = characters.count % number_of_group_characters modulo.zero? ? 0 : number_of_group_characters - modulo end
need_padding?(characters)
click to toggle source
# File lib/alt_characters/alt_base.rb, line 59 def need_padding?(characters) missing_chunks(characters) != 0 end