class Xid::Base32

Constants

ENCODE_HEX

0123456789abcdefghijklmnopqrstuv - Used for encoding

TRIM_LEN

Public Class Methods

b32decode(src) click to toggle source
# File lib/xid/base32.rb, line 19
def b32decode(src)
  decode(src, ENCODE_HEX)
end
b32encode(src) click to toggle source
# File lib/xid/base32.rb, line 15
def b32encode(src)
  encode(src)
end
decode(src, str_map) click to toggle source
# File lib/xid/base32.rb, line 49
def decode(src, str_map)
  src.downcase!

  end_loop = false
  result = []
  while src && !src.empty? && !end_loop
    dst = [0] * 5
    dbuf = [0] * 8
    src_len = 8

    (0..8).each do |i|
      if i >= src.length
        src_len = i
        end_loop = true
        break
      end
      char = src[i]
      dbuf[i] = decode_hex_map[char]
    end

    if src_len >= 8
      dst[4] = (dbuf[6] << 5) | (dbuf[7])
    end
    if src_len >= 7
      dst[3] = (dbuf[4] << 7) | (dbuf[5] << 2) | (dbuf[6] >> 3)
    end
    if src_len >= 5
      dst[2] = (dbuf[3] << 4) | (dbuf[4] >> 1)
    end
    if src_len >= 4
      dst[1] = (dbuf[1] << 6) | (dbuf[2] << 1) | (dbuf[3] >> 4)
    end
    if src_len >= 2
      dst[0] = (dbuf[0] << 3) | (dbuf[1] >> 2)
    end

    dst = dst.map { |x| x & 0xff }

    if src_len == 2
      dst = dst[0]
    elsif src_len == 4
      dst = dst[0..1]
    elsif src_len == 5
      dst = dst[0..2]
    elsif src_len == 7
      dst = dst[0..3]
    elsif src_len == 8
      dst = dst[0..4]
    end

    result += dst
    src = src[8..src.length]
  end

  result
end
decode_hex_map() click to toggle source
# File lib/xid/base32.rb, line 11
def decode_hex_map
  Hash[ENCODE_HEX.each_with_index.map { |x, i| [x, i] }]
end
encode(id) click to toggle source
# File lib/xid/base32.rb, line 23
def encode(id)
  dst = []
  dst[19] = ENCODE_HEX[(id[11] << 4) & 0x1f]
  dst[18] = ENCODE_HEX[(id[11] >> 1) & 0x1f]
  dst[17] = ENCODE_HEX[(id[11] >> 6) & 0x1f | (id[10] << 2) & 0x1f]
  dst[16] = ENCODE_HEX[id[10] >> 3]
  dst[15] = ENCODE_HEX[id[9] & 0x1f]
  dst[14] = ENCODE_HEX[(id[9] >> 5) | (id[8] << 3) & 0x1f]
  dst[13] = ENCODE_HEX[(id[8] >> 2) & 0x1f]
  dst[12] = ENCODE_HEX[id[8] >> 7 | (id[7] << 1) & 0x1f]
  dst[11] = ENCODE_HEX[(id[7] >> 4) & 0x1f | (id[6] << 4) & 0x1f]
  dst[10] = ENCODE_HEX[(id[6] >> 1) & 0x1f]
  dst[9] = ENCODE_HEX[(id[6] >> 6) & 0x1f | (id[5] << 2) & 0x1f]
  dst[8] = ENCODE_HEX[id[5] >> 3]
  dst[7] = ENCODE_HEX[id[4] & 0x1f]
  dst[6] = ENCODE_HEX[id[4] >> 5 | (id[3] << 3) & 0x1f]
  dst[5] = ENCODE_HEX[(id[3] >> 2) & 0x1f]
  dst[4] = ENCODE_HEX[id[3] >> 7 | (id[2] << 1) & 0x1f]
  dst[3] = ENCODE_HEX[(id[2] >> 4) & 0x1f | (id[1] << 4) & 0x1f]
  dst[2] = ENCODE_HEX[(id[1] >> 1) & 0x1f]
  dst[1] = ENCODE_HEX[(id[1] >> 6) & 0x1f | (id[0] << 2) & 0x1f]
  dst[0] = ENCODE_HEX[id[0] >> 3]

  dst.join('')
end