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