sixword 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/sixword/lib.rb CHANGED
@@ -65,7 +65,7 @@ module Sixword
65
65
  # omit padding bits, if any
66
66
  int >>= padding * 8
67
67
 
68
- int
68
+ [int, 8 - padding]
69
69
  end
70
70
 
71
71
  # Extract the padding from a word, e.g. 'WORD3' => 'WORD', 3
@@ -78,7 +78,8 @@ module Sixword
78
78
  end
79
79
 
80
80
  def self.decode_6_words_to_bstring(word_array, padding_ok)
81
- int_to_byte_array(decode_6_words(word_array, padding_ok)).map(&:chr).join
81
+ int_to_byte_array(*decode_6_words(word_array, padding_ok)).
82
+ map(&:chr).join
82
83
  end
83
84
 
84
85
  def self.word_to_bits(word)
@@ -119,6 +120,17 @@ module Sixword
119
120
  parity & 0b11
120
121
  end
121
122
 
123
+ # Given an array of bytes, pack them into a single Integer.
124
+ #
125
+ # For example:
126
+ #
127
+ # >> byte_array_to_int([1, 2])
128
+ # => 258
129
+ #
130
+ # @param byte_array [Array<Fixnum>]
131
+ #
132
+ # @return Integer
133
+ #
122
134
  def self.byte_array_to_int(byte_array)
123
135
  int = 0
124
136
  byte_array.each do |byte|
@@ -128,7 +140,23 @@ module Sixword
128
140
  int
129
141
  end
130
142
 
131
- def self.int_to_byte_array(int)
143
+ # Given an Integer, unpack it into an array of bytes.
144
+ #
145
+ # For example:
146
+ #
147
+ # >> int_to_byte_array(258)
148
+ # => [1, 2]
149
+ #
150
+ # >> int_to_byte_array(258, 3)
151
+ # => [0, 1, 2]
152
+ #
153
+ # @param int [Integer]
154
+ # @param length [Integer] (nil) Left zero padded size of byte array to
155
+ # return. If not provided, no leading zeroes will be added.
156
+ #
157
+ # @return Array<Fixnum>
158
+ #
159
+ def self.int_to_byte_array(int, length=nil)
132
160
  unless int >= 0
133
161
  raise ArgumentError.new("Not sure what to do with negative numbers")
134
162
  end
@@ -140,6 +168,15 @@ module Sixword
140
168
  int >>= 8
141
169
  end
142
170
 
171
+ # pad to appropriate length with leading zeroes
172
+ if length
173
+ raise ArgumentError.new("Cannot pad to length < 0") if length < 0
174
+
175
+ while arr.length < length
176
+ arr << 0
177
+ end
178
+ end
179
+
143
180
  arr.reverse!
144
181
 
145
182
  arr
@@ -1,3 +1,3 @@
1
1
  module Sixword
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -16,7 +16,17 @@ describe Sixword::Lib do
16
16
  %w{ROME MUG FRED SCAN LIVE LACE} => 0xD1854218EBBB0B51,
17
17
  }.each do |words, int|
18
18
  debug_puts "Decoding 6-word array: #{words.inspect}"
19
- Sixword::Lib.decode_6_words(words, false).should == int
19
+ Sixword::Lib.decode_6_words(words, false).should == [int, 8]
20
20
  end
21
21
  end
22
+
23
+
24
+ it 'should convert byte arrays to ints' do
25
+ Sixword::Lib.byte_array_to_int([1, 2]).should == 258
26
+ end
27
+
28
+ it 'should convert ints to byte arrays' do
29
+ Sixword::Lib.int_to_byte_array(258).should == [1, 2]
30
+ Sixword::Lib.int_to_byte_array(258, 3).should == [0, 1, 2]
31
+ end
22
32
  end
data/spec/sixword_spec.rb CHANGED
@@ -56,6 +56,24 @@ describe Sixword do
56
56
  end
57
57
  end
58
58
 
59
+ it 'should handle all null bytes correctly' do
60
+ binary = "\0" * 8
61
+ encoded = ['A'] * 6
62
+ Sixword.encode(binary).should == encoded
63
+ Sixword.decode(encoded).should == binary
64
+ end
65
+
66
+ it 'should handle padded null bytes correctly' do
67
+ {
68
+ "\0\0\0foo" => ["A", "A", "HAY", "SLEW", "TROT", "A2"],
69
+ "\0\0\0foo\0\0" => ["A", "A", "HAY", "SLEW", "TROT", "A"],
70
+ "foo\0\0" => ["CHUB", "EMIL", "MUDD", "A", "A", "A3"],
71
+ }.each do |binary, encoded|
72
+ Sixword.pad_encode(binary).should == encoded
73
+ Sixword.pad_decode(encoded).should == binary
74
+ end
75
+ end
76
+
59
77
  it 'should convert hex strings to byte strings' do
60
78
  {"03e755bf6982fa55" => "\x03\xe7\x55\xbf\x69\x82\xfa\x55",
61
79
  "19dd19a502ca2d60" => "\x19\xdd\x19\xa5\x02\xca\x2d\x60",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sixword
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-27 00:00:00.000000000 Z
12
+ date: 2014-07-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -106,7 +106,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
106
  version: '0'
107
107
  segments:
108
108
  - 0
109
- hash: -1062992431278592122
109
+ hash: -2360590348015650263
110
110
  required_rubygems_version: !ruby/object:Gem::Requirement
111
111
  none: false
112
112
  requirements:
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
115
  version: '0'
116
116
  segments:
117
117
  - 0
118
- hash: -1062992431278592122
118
+ hash: -2360590348015650263
119
119
  requirements: []
120
120
  rubyforge_project:
121
121
  rubygems_version: 1.8.23