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