bit-struct 0.13.5 → 0.17
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.
- checksums.yaml +7 -0
- data/History.txt +22 -1
- data/LICENSE +56 -0
- data/{README.txt → README.md} +94 -92
- data/Rakefile +56 -30
- data/examples/field-ripper.rb +1 -1
- data/examples/ip.rb +6 -6
- data/examples/longlong.rb +2 -2
- data/examples/md.rb +1 -1
- data/examples/modular-def.rb +2 -2
- data/examples/native.rb +3 -3
- data/examples/ping.rb +1 -1
- data/examples/raw.rb +1 -1
- data/examples/switch-endian.rb +2 -2
- data/examples/vector.rb +2 -2
- data/lib/bit-struct.rb +0 -11
- data/lib/bit-struct/bit-struct.rb +61 -143
- data/lib/bit-struct/char-field.rb +3 -3
- data/lib/bit-struct/field.rb +94 -0
- data/lib/bit-struct/fields.rb +13 -13
- data/lib/bit-struct/float-field.rb +4 -4
- data/lib/bit-struct/hex-octet-field.rb +3 -3
- data/lib/bit-struct/nested-field.rb +8 -8
- data/lib/bit-struct/octet-field.rb +4 -4
- data/lib/bit-struct/signed-field.rb +23 -28
- data/lib/bit-struct/text-field.rb +2 -2
- data/lib/bit-struct/unsigned-field.rb +24 -27
- data/lib/bit-struct/vector-field.rb +7 -7
- data/lib/bit-struct/vector.rb +24 -22
- data/lib/bit-struct/yaml.rb +22 -3
- data/test/test-endian.rb +5 -5
- data/test/test-vector.rb +6 -6
- data/test/test.rb +71 -46
- metadata +43 -69
- data/.gitignore +0 -3
- data/TODO +0 -20
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
data/test/test-vector.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'bit-struct'
|
3
3
|
|
4
|
-
class Test_Vector < Test
|
4
|
+
class Test_Vector < Minitest::Test
|
5
5
|
class Packet < BitStruct
|
6
6
|
unsigned :stuff, 32, "whatever"
|
7
7
|
|
@@ -9,20 +9,20 @@ class Test_Vector < Test::Unit::TestCase
|
|
9
9
|
unsigned :x, 16
|
10
10
|
signed :y, 32
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
unsigned :other, 16, "other stuff"
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
attr_reader :pkt
|
17
17
|
|
18
18
|
def setup
|
19
19
|
@pkt = Packet.new
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def test_length
|
23
23
|
assert_equal(Packet.round_byte_length, pkt.length)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def test_writers
|
27
27
|
assert_equal(pkt.v[2].x, 0)
|
28
28
|
v = pkt.v
|
data/test/test.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'test/unit'
|
1
|
+
require 'minitest/autorun'
|
4
2
|
require 'bit-struct'
|
5
3
|
|
6
|
-
class Test_BitStruct < Test
|
4
|
+
class Test_BitStruct < Minitest::Test
|
7
5
|
|
8
6
|
class T1 < BitStruct
|
9
7
|
unsigned :foo, 8
|
@@ -12,18 +10,18 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
12
10
|
class T2 < BitStruct
|
13
11
|
unsigned :bar, 8
|
14
12
|
end
|
15
|
-
|
13
|
+
|
16
14
|
class Rest < BitStruct
|
17
15
|
unsigned :zap, 8
|
18
16
|
rest :body, T2
|
19
17
|
end
|
20
|
-
|
18
|
+
|
21
19
|
class NestedPart < BitStruct
|
22
20
|
unsigned :x, 5
|
23
21
|
unsigned :y, 3, :default => 2
|
24
22
|
char :s, 5*8
|
25
23
|
end
|
26
|
-
|
24
|
+
|
27
25
|
class Container < BitStruct
|
28
26
|
nest :n1, NestedPart, :default => NestedPart.new(:x=>1, :s=>"deflt")
|
29
27
|
nest :n2, NestedPart
|
@@ -68,7 +66,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
68
66
|
float next_name, 64, :format => "%10.5f"
|
69
67
|
|
70
68
|
octets next_name, 32, :default => "192.168.1.123"
|
71
|
-
|
69
|
+
|
72
70
|
hex_octets next_name, 48, :default => "ab:cd:ef:01:23:45"
|
73
71
|
|
74
72
|
unsigned next_name, 1
|
@@ -78,14 +76,14 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
78
76
|
signed next_name, 7, :fixed => 1000 # unaligned!
|
79
77
|
|
80
78
|
char next_name, 24
|
81
|
-
|
79
|
+
|
82
80
|
rest :bs_body
|
83
|
-
|
81
|
+
|
84
82
|
INITIAL_VALUES = {
|
85
83
|
f1 => 1234,
|
86
84
|
f2 => 5678
|
87
85
|
}
|
88
|
-
|
86
|
+
|
89
87
|
INITIAL_VALUES.each do |f, v|
|
90
88
|
initial_value.send "#{f}=", v
|
91
89
|
end
|
@@ -108,11 +106,11 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
108
106
|
unsigned next_name, 8
|
109
107
|
|
110
108
|
unsigned next_name, 1
|
111
|
-
|
109
|
+
|
112
110
|
rest :bs1_body
|
113
111
|
|
114
112
|
end
|
115
|
-
|
113
|
+
|
116
114
|
def setup
|
117
115
|
srand(767343)
|
118
116
|
@bs = BS.new
|
@@ -129,7 +127,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
129
127
|
bs.fields.each do |field|
|
130
128
|
iv = initial_values && initial_values[field.name]
|
131
129
|
iv ||= field.default
|
132
|
-
|
130
|
+
|
133
131
|
if iv
|
134
132
|
case field
|
135
133
|
when BitStruct::FloatField
|
@@ -143,21 +141,21 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
143
141
|
end
|
144
142
|
end
|
145
143
|
end
|
146
|
-
|
144
|
+
|
147
145
|
def test_init_with_value
|
148
146
|
randomize(@bs_1)
|
149
147
|
|
150
148
|
b = BS_1.new(@bs_1)
|
151
149
|
assert_equal(@bs_1, b, "Initialize with argument failed.")
|
152
|
-
|
150
|
+
|
153
151
|
c = BS_1.new(b)
|
154
152
|
assert_equal(@bs_1, c, "Initialize with argument failed.")
|
155
|
-
|
153
|
+
|
156
154
|
b1 = BS_1.new("")
|
157
155
|
b2 = BS_1.new(nil)
|
158
156
|
assert_equal(b1, b2, "Initialize with short argument failed.")
|
159
157
|
end
|
160
|
-
|
158
|
+
|
161
159
|
def test_init_with_hash
|
162
160
|
randomize(@bs_1)
|
163
161
|
|
@@ -169,25 +167,25 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
169
167
|
b = BS_1.new(h)
|
170
168
|
assert_equal(@bs_1, b, "Initialize with argument failed.")
|
171
169
|
end
|
172
|
-
|
170
|
+
|
173
171
|
def test_join
|
174
172
|
assert_equal(@bs+@bs_1, BitStruct.join(@bs,@bs_1))
|
175
173
|
assert_equal(@bs+@bs_1, [@bs,@bs_1].join(""))
|
176
174
|
end
|
177
|
-
|
175
|
+
|
178
176
|
def test_parse
|
179
177
|
orig = @testers
|
180
178
|
orig.each do |bs|
|
181
179
|
randomize(bs)
|
182
180
|
end
|
183
|
-
|
181
|
+
|
184
182
|
data = BitStruct.join(orig)
|
185
183
|
round_trip = BitStruct.parse(data, orig.map{|bs|bs.class})
|
186
184
|
orig.zip(round_trip) do |bs1, bs2|
|
187
185
|
assert_equal(bs1, bs2)
|
188
186
|
end
|
189
187
|
end
|
190
|
-
|
188
|
+
|
191
189
|
def test_closed
|
192
190
|
assert_raises(BitStruct::ClosedClassError) do
|
193
191
|
BS.class_eval do
|
@@ -195,7 +193,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
195
193
|
end
|
196
194
|
end
|
197
195
|
end
|
198
|
-
|
196
|
+
|
199
197
|
def test_rest
|
200
198
|
len0 = @bs_1.length
|
201
199
|
|
@@ -206,16 +204,16 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
206
204
|
@bs_1.bs1_body = "b"*60
|
207
205
|
assert_equal("b"*60, @bs_1.bs1_body)
|
208
206
|
assert_equal(len0+60, @bs_1.length)
|
209
|
-
|
207
|
+
|
210
208
|
@bs_1.bs1_body = "c"*40
|
211
209
|
assert_equal("c"*40, @bs_1.bs1_body)
|
212
210
|
assert_equal(len0+40, @bs_1.length)
|
213
|
-
|
211
|
+
|
214
212
|
@bs_1.bs1_body = ""
|
215
213
|
assert_equal("", @bs_1.bs1_body)
|
216
214
|
assert_equal(len0, @bs_1.length)
|
217
215
|
end
|
218
|
-
|
216
|
+
|
219
217
|
def test_rest_with_class
|
220
218
|
r = Rest.new
|
221
219
|
t2 = T2.new
|
@@ -223,38 +221,44 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
223
221
|
r.body = t2
|
224
222
|
assert_equal(123, r.body.bar)
|
225
223
|
end
|
226
|
-
|
224
|
+
|
225
|
+
def test_rest_with_class_constructed
|
226
|
+
r = Rest.new(['0011'].pack('H*'))
|
227
|
+
assert_equal(0x00, r.zap)
|
228
|
+
assert_equal(0x11, r.body.bar)
|
229
|
+
end
|
230
|
+
|
227
231
|
def test_nest
|
228
232
|
cont = Container.new
|
229
233
|
n1 = cont.n1
|
230
|
-
|
234
|
+
|
231
235
|
assert_equal(1, n1.x)
|
232
236
|
assert_equal(2, n1.y)
|
233
237
|
assert_equal("deflt", n1.s)
|
234
|
-
|
238
|
+
|
235
239
|
n1.sub(/./, " ")
|
236
240
|
|
237
241
|
assert_equal(1, n1.x)
|
238
242
|
assert_equal(2, n1.y)
|
239
243
|
assert_equal("deflt", n1.s)
|
240
|
-
|
244
|
+
|
241
245
|
n1 = cont.n1
|
242
246
|
n2 = cont.n2
|
243
|
-
|
247
|
+
|
244
248
|
assert_equal(0, n2.x)
|
245
249
|
assert_equal(2, n2.y)
|
246
250
|
assert_equal("\0"*5, n2.s)
|
247
|
-
|
251
|
+
|
248
252
|
n = NestedPart.new(:x=>4, :y=>1, :s=>"qwert")
|
249
253
|
cont.n1 = n
|
250
254
|
|
251
255
|
assert_equal(4, cont.n1.x)
|
252
256
|
assert_equal(1, cont.n1.y)
|
253
257
|
assert_equal("qwert", cont.n1.s)
|
254
|
-
|
258
|
+
|
255
259
|
assert_raises(ArgumentError) {cont.n2 = Container.new}
|
256
260
|
end
|
257
|
-
|
261
|
+
|
258
262
|
def test_overflow
|
259
263
|
ov = Overflow.new
|
260
264
|
empty = ov.dup
|
@@ -289,21 +293,21 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
289
293
|
|
290
294
|
repeat_access_test(@bs_1, 10)
|
291
295
|
end
|
292
|
-
|
296
|
+
|
293
297
|
def test_initial_value
|
294
298
|
bs = @bs
|
295
299
|
bs.class::INITIAL_VALUES.each do |f,v|
|
296
300
|
assert_equal(v, bs.send(f), "In #{f} of a #{bs.class}")
|
297
301
|
end
|
298
302
|
end
|
299
|
-
|
303
|
+
|
300
304
|
def test_inherited_initial_value
|
301
305
|
bs = @bs_1
|
302
306
|
bs.class::INITIAL_VALUES.each do |f,v|
|
303
307
|
assert_equal(v, bs.send(f), "In #{f} of a #{bs.class}")
|
304
308
|
end
|
305
309
|
end
|
306
|
-
|
310
|
+
|
307
311
|
def test_to_h
|
308
312
|
h = @bs_1.to_h(:convert_keys => :to_s)
|
309
313
|
field_names = @bs_1.fields.map{|f|f.name.to_s}
|
@@ -312,7 +316,28 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
312
316
|
assert_equal(@bs_1.send(name), h[name])
|
313
317
|
end
|
314
318
|
end
|
315
|
-
|
319
|
+
|
320
|
+
def test_to_a_exclude_rest
|
321
|
+
include_rest = false
|
322
|
+
a = @bs_1.to_a(include_rest)
|
323
|
+
field_names = @bs_1.fields.map{|f|f.name.to_s}
|
324
|
+
assert_equal(a.size, field_names.size)
|
325
|
+
field_names.each_with_index do |name, i|
|
326
|
+
assert_equal(@bs_1.send(name), a[i])
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_to_a
|
331
|
+
include_rest = true
|
332
|
+
a = @bs_1.to_a(include_rest)
|
333
|
+
field_names = @bs_1.fields.map{|f|f.name.to_s}
|
334
|
+
field_names << @bs_1.rest_field.name
|
335
|
+
assert_equal(a.size, field_names.size)
|
336
|
+
field_names.each_with_index do |name, i|
|
337
|
+
assert_equal(@bs_1.send(name), a[i])
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
316
341
|
def test_format_option
|
317
342
|
formatted_fields = @bs.fields.select {|f|f.format}
|
318
343
|
formatted_fields.each do |f|
|
@@ -320,18 +345,18 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
320
345
|
assert_equal(f.format % val, f.inspect_in_object(@bs, {}))
|
321
346
|
end
|
322
347
|
end
|
323
|
-
|
348
|
+
|
324
349
|
def test_yaml
|
325
350
|
assert_equal(@bs_1, YAML.load(@bs_1.to_yaml))
|
326
351
|
end
|
327
|
-
|
352
|
+
|
328
353
|
def test_field_by_name
|
329
354
|
name = :f007
|
330
355
|
f = @bs.field_by_name(name)
|
331
356
|
assert(f)
|
332
357
|
assert_equal(f.name, name)
|
333
358
|
end
|
334
|
-
|
359
|
+
|
335
360
|
#--------
|
336
361
|
def repeat_access_test(bs, n)
|
337
362
|
last_set_value = {}
|
@@ -352,7 +377,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
352
377
|
begin
|
353
378
|
assert_equal(lsv2, bs.send(f2.name))
|
354
379
|
rescue Test::Unit::AssertionFailedError => ex
|
355
|
-
msg =
|
380
|
+
msg =
|
356
381
|
"In #{f2.inspect} after setting #{field.inspect} to" +
|
357
382
|
" #{last_set_value[field].inspect}"
|
358
383
|
raise ex, msg + "\n" + ex.message, ex.backtrace
|
@@ -367,7 +392,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
367
392
|
|
368
393
|
assert_equal(start_length, finish_length, "Length differs after test!")
|
369
394
|
end
|
370
|
-
|
395
|
+
|
371
396
|
def randomize(bs)
|
372
397
|
bs.fields.each do |f|
|
373
398
|
randomize_field(bs, f)
|
@@ -413,13 +438,13 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
413
438
|
value = s * (field.length/8)
|
414
439
|
bs.send "#{field.name}=", value
|
415
440
|
last_set_value = value
|
416
|
-
|
441
|
+
|
417
442
|
when BitStruct::TextField
|
418
443
|
s = (rand(64)+32).chr
|
419
444
|
value = s * rand(field.length*2/8)
|
420
445
|
bs.send "#{field.name}=", value
|
421
446
|
last_set_value = s * [field.length/8, value.length].min
|
422
|
-
|
447
|
+
|
423
448
|
when BitStruct::FloatField
|
424
449
|
value = rand(2**30)
|
425
450
|
bs.send "#{field.name}=", value
|
@@ -427,7 +452,7 @@ class Test_BitStruct < Test::Unit::TestCase
|
|
427
452
|
|
428
453
|
else raise
|
429
454
|
end
|
430
|
-
|
455
|
+
|
431
456
|
return last_set_value
|
432
457
|
end
|
433
458
|
end
|
metadata
CHANGED
@@ -1,44 +1,29 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: bit-struct
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.17'
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Joel VanderWerf
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: bones
|
17
|
-
type: :development
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 2.5.1
|
24
|
-
version:
|
25
|
-
description: |
|
26
|
-
Library for packed binary data stored in ruby Strings. Useful for accessing fields in network packets and binary files.
|
27
|
-
|
11
|
+
date: 2021-04-20 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Library for packed binary data stored in ruby Strings. Useful for accessing
|
14
|
+
fields in network packets and binary files.
|
28
15
|
email: vjoel@users.sourceforge.net
|
29
16
|
executables: []
|
30
|
-
|
31
17
|
extensions: []
|
32
|
-
|
33
|
-
extra_rdoc_files:
|
18
|
+
extra_rdoc_files:
|
34
19
|
- History.txt
|
35
|
-
- README.
|
36
|
-
|
37
|
-
|
20
|
+
- README.md
|
21
|
+
- LICENSE
|
22
|
+
files:
|
38
23
|
- History.txt
|
39
|
-
-
|
24
|
+
- LICENSE
|
25
|
+
- README.md
|
40
26
|
- Rakefile
|
41
|
-
- TODO
|
42
27
|
- examples/ara-player-data.rb
|
43
28
|
- examples/bignum.rb
|
44
29
|
- examples/bits.rb
|
@@ -63,6 +48,7 @@ files:
|
|
63
48
|
- lib/bit-struct.rb
|
64
49
|
- lib/bit-struct/bit-struct.rb
|
65
50
|
- lib/bit-struct/char-field.rb
|
51
|
+
- lib/bit-struct/field.rb
|
66
52
|
- lib/bit-struct/fields.rb
|
67
53
|
- lib/bit-struct/float-field.rb
|
68
54
|
- lib/bit-struct/hex-octet-field.rb
|
@@ -75,52 +61,40 @@ files:
|
|
75
61
|
- lib/bit-struct/vector-field.rb
|
76
62
|
- lib/bit-struct/vector.rb
|
77
63
|
- lib/bit-struct/yaml.rb
|
78
|
-
- tasks/ann.rake
|
79
|
-
- tasks/bones.rake
|
80
|
-
- tasks/gem.rake
|
81
|
-
- tasks/git.rake
|
82
|
-
- tasks/notes.rake
|
83
|
-
- tasks/post_load.rake
|
84
|
-
- tasks/rdoc.rake
|
85
|
-
- tasks/rubyforge.rake
|
86
|
-
- tasks/setup.rb
|
87
|
-
- tasks/spec.rake
|
88
|
-
- tasks/svn.rake
|
89
|
-
- tasks/test.rake
|
90
|
-
- tasks/zentest.rake
|
91
64
|
- test/test-endian.rb
|
92
65
|
- test/test-vector.rb
|
93
66
|
- test/test.rb
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
post_install_message:
|
99
|
-
rdoc_options:
|
100
|
-
- --
|
101
|
-
-
|
102
|
-
|
67
|
+
homepage: https://github.com/vjoel/bit-struct
|
68
|
+
licenses:
|
69
|
+
- Ruby
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- "--quiet"
|
74
|
+
- "--line-numbers"
|
75
|
+
- "--inline-source"
|
76
|
+
- "--title"
|
77
|
+
- BitStruct
|
78
|
+
- "--main"
|
79
|
+
- README.md
|
80
|
+
require_paths:
|
103
81
|
- lib
|
104
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
106
84
|
- - ">="
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version:
|
109
|
-
|
110
|
-
|
111
|
-
requirements:
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
112
89
|
- - ">="
|
113
|
-
- !ruby/object:Gem::Version
|
114
|
-
version:
|
115
|
-
version:
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
116
92
|
requirements: []
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
signing_key:
|
121
|
-
specification_version: 3
|
93
|
+
rubygems_version: 3.2.15
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
122
96
|
summary: Library for packed binary data stored in ruby Strings
|
123
|
-
test_files:
|
97
|
+
test_files:
|
124
98
|
- test/test-endian.rb
|
125
|
-
- test/test.rb
|
126
99
|
- test/test-vector.rb
|
100
|
+
- test/test.rb
|