module OTP::Base32

Constants

DECODE_MAP
ENCODE_CHARS

Public Instance Methods

decode(chars) click to toggle source
# File lib/otp/base32.rb, line 41
def decode(chars)
  return nil unless chars
  ret = "".force_encoding("binary")
  chars = chars.upcase
  buffer = buffered = 0
  chars.each_char do |c|
    d = DECODE_MAP[c]
    raise ArgumentError, "invalid char: #{c}" if d.nil?
    next if d == -2
    break if d == -1
    buffer = (buffer << 5) | d
    buffered += 5
    next if buffered < 8
    ret << ((buffer >> (buffered - 8)) & 0xff)
    buffered -= 8
  end
  return ret
end
encode(bytes) click to toggle source
# File lib/otp/base32.rb, line 20
def encode(bytes)
  return nil unless bytes
  bytes = bytes.dup.force_encoding("binary")
  ret = ""
  offset = buffer = buffered = 0
  while offset < bytes.length
    buffer = ((buffer << 8) | bytes[offset].ord)
    buffered += 8
    offset += 1
    while buffered >= 5
      ret << ENCODE_CHARS[buffer >> (buffered - 5)]
      buffered -= 5
      buffer &= (0xff >> (8 - buffered))
    end
  end
  if buffered > 0
    ret << ENCODE_CHARS[buffer << (5 - buffered)]
  end
  return ret
end