Module: Crockford

Defined in:
lib/crockford.rb,
lib/crockford/version.rb

Overview

Encodes and decodes Crockford’s Base32 variation.

Constant Summary collapse

ENCODER =
%w[0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K M N P Q R S T V W X Y Z].freeze
DECODER =
ENCODER.each_with_index.to_h.transform_keys(&:to_s).merge({ "I" => 1, "L" => 1, "O" => 0 }).freeze
VERSION =
"0.2.0"

Class Method Summary collapse

Class Method Details

.decode_number(string) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/crockford.rb', line 21

def decode_number(string)
  clean_code(string).each_char.inject(0) do |result, char|
    val = DECODER[char]
    return nil if val.nil?

    (result << 5) + val
  end
end

.decode_string(string) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/crockford.rb', line 35

def decode_string(string)
  number = decode_number(string)
  return nil if number.nil?

  number.to_s(2).each_char.reverse_each.each_slice(8).map do |byte|
    byte.reverse.join.to_i(2)
  end.reverse.pack("C*")
end

.encode_number(number, **kwargs) ⇒ Object



13
14
15
16
17
18
19
# File 'lib/crockford.rb', line 13

def encode_number(number, **kwargs)
  string = number.to_s(2).each_char.reverse_each.each_slice(5).map do |bits|
    ENCODER[bits.reverse.join.to_i(2)]
  end.reverse.join

  format_code(string, **kwargs)
end

.encode_string(string, **kwargs) ⇒ Object



30
31
32
33
# File 'lib/crockford.rb', line 30

def encode_string(string, **kwargs)
  number = string.bytes.map { |byte| format("%08b", byte) }.join.to_i(2)
  encode_number(number, **kwargs)
end

.generate(length:, split: false) ⇒ Object



55
56
57
# File 'lib/crockford.rb', line 55

def generate(length:, split: false)
  encode_number(SecureRandom.random_number(32**length), split: split, length: length)
end

.normalize(string, unknown: "?", **kwargs) ⇒ Object



44
45
46
47
48
49
# File 'lib/crockford.rb', line 44

def normalize(string, unknown: "?", **kwargs)
  string = clean_code(string).each_char.inject("") do |memo, char|
    memo + ((index = DECODER[char]) ? ENCODER[index] : unknown)
  end
  format_code(string, **kwargs)
end

.valid?(string) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/crockford.rb', line 51

def valid?(string)
  !decode_number(string).nil?
end