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
- .decode_number(string) ⇒ Object
- .decode_string(string) ⇒ Object
- .encode_number(number, **kwargs) ⇒ Object
- .encode_string(string, **kwargs) ⇒ Object
- .generate(length:, split: false) ⇒ Object
- .normalize(string, unknown: "?", **kwargs) ⇒ Object
- .valid?(string) ⇒ Boolean
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
51 52 53 |
# File 'lib/crockford.rb', line 51 def valid?(string) !decode_number(string).nil? end |