bindata 2.4.4 → 2.4.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bindata might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/ChangeLog.rdoc +24 -0
- data/bindata.gemspec +2 -4
- data/examples/list.rb +1 -1
- data/examples/tcp_ip.rb +2 -2
- data/lib/bindata/alignment.rb +1 -1
- data/lib/bindata/array.rb +16 -8
- data/lib/bindata/base.rb +1 -2
- data/lib/bindata/int.rb +3 -3
- data/lib/bindata/io.rb +6 -4
- data/lib/bindata/stringz.rb +2 -2
- data/lib/bindata/version.rb +1 -1
- data/test/array_test.rb +5 -0
- data/test/bits_test.rb +2 -2
- data/test/buffer_test.rb +0 -1
- data/test/delayed_io_test.rb +3 -3
- data/test/int_test.rb +1 -1
- data/test/offset_test.rb +9 -3
- data/test/registry_test.rb +9 -3
- data/test/stringz_test.rb +2 -2
- data/test/system_test.rb +34 -0
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a511668b89503e38575dbc2eb0f02e542556c63bf008294a2a99a4f116639d74
|
4
|
+
data.tar.gz: 259742f4fe4f2632b0edca7bf155277198291663546ff3c148d1d515ac8e76d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e2f3a1a41443ec3ddfc44734bd7c1e03d6c957ea86d86fa68f0ec913df63ac5c2a32e26ef73fe2d8abe889fdfe916d2e9fc97686ede3fd6e1e51598480acbb5
|
7
|
+
data.tar.gz: e3f21a9882a1a259044cfd284308ba6d13d1bef9674b03c7a501fae53a30fac5b868a9d5a11bc10302889bd03d5e73e6e9203c1b5b395b9ba12a33ed9b4c7f72
|
data/.travis.yml
CHANGED
data/ChangeLog.rdoc
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
= BinData Changelog
|
2
2
|
|
3
|
+
== Version 2.4.9 (2021-04-22)
|
4
|
+
|
5
|
+
* Change example from Fixnum to Integer. Thanks to Tim Chambers.
|
6
|
+
* Now works with frozen string literals. Requested by Jeremy Evans.
|
7
|
+
|
8
|
+
== Version 2.4.8 (2020-07-21)
|
9
|
+
|
10
|
+
* Bug fix array self assignment. Thanks to Spencer McIntyre.
|
11
|
+
* Bug fix Stringz max_length. Thanks to cdelafuente-r7.
|
12
|
+
|
13
|
+
== Version 2.4.7 (2020-03-31)
|
14
|
+
|
15
|
+
* Fix choice assignment inside arrays. Reported by Spencer McIntyre.
|
16
|
+
|
17
|
+
== Version 2.4.6 (2020-02-27)
|
18
|
+
|
19
|
+
* More encoding fixes. Thanks to Aaron Patterson.
|
20
|
+
|
21
|
+
== Version 2.4.5 (2020-02-21)
|
22
|
+
|
23
|
+
* Small typo fixes to examples.
|
24
|
+
* Fix encoding issue for ruby 2.7. Thanks to Aaron Patterson.
|
25
|
+
* Quieter test output.
|
26
|
+
|
3
27
|
== Version 2.4.4 (2018-10-03)
|
4
28
|
|
5
29
|
* Display a hint when endian is omitted. Requested by Tails.
|
data/bindata.gemspec
CHANGED
@@ -8,17 +8,15 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.summary = 'A declarative way to read and write binary file formats'
|
9
9
|
s.author = 'Dion Mendel'
|
10
10
|
s.email = 'bindata@dm9.info'
|
11
|
-
s.homepage = '
|
12
|
-
s.rubyforge_project = 'bindata'
|
11
|
+
s.homepage = 'https://github.com/dmendel/bindata'
|
13
12
|
s.require_path = 'lib'
|
14
|
-
s.has_rdoc = true
|
15
13
|
s.extra_rdoc_files = ['NEWS.rdoc']
|
16
14
|
s.rdoc_options << '--main' << 'NEWS.rdoc'
|
17
15
|
s.files = `git ls-files`.split("\n")
|
18
16
|
s.license = 'Ruby'
|
19
17
|
|
20
18
|
s.add_development_dependency('rake')
|
21
|
-
s.add_development_dependency('minitest', "> 5.0.0")
|
19
|
+
s.add_development_dependency('minitest', "> 5.0.0", "< 5.12.0")
|
22
20
|
s.add_development_dependency('coveralls')
|
23
21
|
s.description = <<-END.gsub(/^ +/, "")
|
24
22
|
BinData is a declarative way to read and write binary file formats.
|
data/examples/list.rb
CHANGED
data/examples/tcp_ip.rb
CHANGED
@@ -14,7 +14,7 @@ class MacAddr < BinData::Primitive
|
|
14
14
|
array :octets, type: :uint8, initial_length: 6
|
15
15
|
|
16
16
|
def set(val)
|
17
|
-
self.octets = val.split(
|
17
|
+
self.octets = val.split(/:/).collect(&:to_i)
|
18
18
|
end
|
19
19
|
|
20
20
|
def get
|
@@ -23,7 +23,7 @@ class MacAddr < BinData::Primitive
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Present IP addresses in a human readable way
|
26
|
-
class
|
26
|
+
class IP_Addr < BinData::Primitive
|
27
27
|
array :octets, type: :uint8, initial_length: 4
|
28
28
|
|
29
29
|
def set(val)
|
data/lib/bindata/alignment.rb
CHANGED
data/lib/bindata/array.rb
CHANGED
@@ -80,9 +80,11 @@ module BinData
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def assign(array)
|
83
|
+
return if self.equal?(array) # prevent self assignment
|
83
84
|
raise ArgumentError, "can't set a nil value for #{debug_name}" if array.nil?
|
84
85
|
|
85
|
-
@element_list =
|
86
|
+
@element_list = []
|
87
|
+
concat(array)
|
86
88
|
end
|
87
89
|
|
88
90
|
def snapshot
|
@@ -119,7 +121,17 @@ module BinData
|
|
119
121
|
|
120
122
|
def insert(index, *objs)
|
121
123
|
extend_array(index - 1)
|
122
|
-
|
124
|
+
abs_index = (index >= 0) ? index : index + 1 + length
|
125
|
+
|
126
|
+
# insert elements before...
|
127
|
+
new_elements = objs.map { new_element }
|
128
|
+
elements.insert(index, *new_elements)
|
129
|
+
|
130
|
+
# ...assigning values
|
131
|
+
objs.each_with_index do |obj, i|
|
132
|
+
self[abs_index + i] = obj
|
133
|
+
end
|
134
|
+
|
123
135
|
self
|
124
136
|
end
|
125
137
|
|
@@ -238,10 +250,6 @@ module BinData
|
|
238
250
|
end
|
239
251
|
end
|
240
252
|
|
241
|
-
def to_storage_formats(els)
|
242
|
-
els.collect { |el| new_element(el) }
|
243
|
-
end
|
244
|
-
|
245
253
|
def elements
|
246
254
|
@element_list ||= []
|
247
255
|
end
|
@@ -252,8 +260,8 @@ module BinData
|
|
252
260
|
element
|
253
261
|
end
|
254
262
|
|
255
|
-
def new_element
|
256
|
-
@element_prototype.instantiate(
|
263
|
+
def new_element
|
264
|
+
@element_prototype.instantiate(nil, self)
|
257
265
|
end
|
258
266
|
|
259
267
|
def sum_num_bytes_for_all_elements
|
data/lib/bindata/base.rb
CHANGED
data/lib/bindata/int.rb
CHANGED
@@ -107,7 +107,7 @@ module BinData
|
|
107
107
|
parts = (0...nwords).collect do |i|
|
108
108
|
"(ints.at(#{idx[i]}) << #{bits_per_word(nbits) * i})"
|
109
109
|
end
|
110
|
-
parts[0].sub
|
110
|
+
parts[0] = parts[0].sub(/ << 0\b/, "") # Remove " << 0" for optimisation
|
111
111
|
|
112
112
|
parts.join(" + ")
|
113
113
|
end
|
@@ -132,7 +132,7 @@ module BinData
|
|
132
132
|
mask = (1 << bits_per_word(nbits)) - 1
|
133
133
|
|
134
134
|
vals = (0...nwords).collect { |i| "val >> #{bits_per_word(nbits) * i}" }
|
135
|
-
vals[0].sub
|
135
|
+
vals[0] = vals[0].sub(/ >> 0\b/, "") # Remove " >> 0" for optimisation
|
136
136
|
vals.reverse! if (endian == :big)
|
137
137
|
|
138
138
|
vals = vals.collect { |val| "#{val} & #{mask}" } # TODO: "& mask" is needed to work around jruby bug. Remove this line when fixed.
|
@@ -160,7 +160,7 @@ module BinData
|
|
160
160
|
directives = { 8 => "C", 16 => "S", 32 => "L", 64 => "Q" }
|
161
161
|
|
162
162
|
d = directives[bits_per_word(nbits)]
|
163
|
-
d
|
163
|
+
d += ((endian == :big) ? ">" : "<") unless d == "C"
|
164
164
|
|
165
165
|
if signed == :signed && directives.key?(nbits)
|
166
166
|
(d * nwords).downcase
|
data/lib/bindata/io.rb
CHANGED
@@ -169,7 +169,7 @@ module BinData
|
|
169
169
|
|
170
170
|
unless @read_data.empty? || @in_readahead
|
171
171
|
bytes_to_consume = [n, @read_data.length].min
|
172
|
-
data
|
172
|
+
data += @read_data.slice!(0, bytes_to_consume)
|
173
173
|
n -= bytes_to_consume
|
174
174
|
|
175
175
|
if @read_data.empty?
|
@@ -180,10 +180,10 @@ module BinData
|
|
180
180
|
end
|
181
181
|
|
182
182
|
raw_data = @raw_io.read(n)
|
183
|
-
data
|
183
|
+
data += raw_data if raw_data
|
184
184
|
|
185
185
|
if @in_readahead
|
186
|
-
@read_data
|
186
|
+
@read_data += data
|
187
187
|
end
|
188
188
|
|
189
189
|
@offset += data.size
|
@@ -213,7 +213,9 @@ module BinData
|
|
213
213
|
|
214
214
|
# Creates a StringIO around +str+.
|
215
215
|
def self.create_string_io(str = "")
|
216
|
-
StringIO.new(str.dup.force_encoding(Encoding::BINARY))
|
216
|
+
s = StringIO.new(str.dup.force_encoding(Encoding::BINARY))
|
217
|
+
s.binmode
|
218
|
+
s
|
217
219
|
end
|
218
220
|
|
219
221
|
# Create a new IO Read wrapper around +io+. +io+ must provide #read,
|
data/lib/bindata/stringz.rb
CHANGED
@@ -54,7 +54,7 @@ module BinData
|
|
54
54
|
# read until zero byte or we have read in the max number of bytes
|
55
55
|
while ch != "\0" && i != max_length
|
56
56
|
ch = io.readbytes(1)
|
57
|
-
str
|
57
|
+
str += ch
|
58
58
|
i += 1
|
59
59
|
end
|
60
60
|
|
@@ -80,7 +80,7 @@ module BinData
|
|
80
80
|
def trim_to!(str, max_length = nil)
|
81
81
|
if max_length
|
82
82
|
max_length = 1 if max_length < 1
|
83
|
-
str.slice!(max_length)
|
83
|
+
str.slice!(max_length..-1)
|
84
84
|
if str.length == max_length && str[-1, 1] != "\0"
|
85
85
|
str[-1, 1] = "\0"
|
86
86
|
end
|
data/lib/bindata/version.rb
CHANGED
data/test/array_test.rb
CHANGED
@@ -266,6 +266,11 @@ describe BinData::Array, "when accessing elements" do
|
|
266
266
|
lambda { obj["a"] }.must_raise TypeError
|
267
267
|
lambda { obj[1, "a"] }.must_raise TypeError
|
268
268
|
end
|
269
|
+
|
270
|
+
it "is unaffected by self assignment" do
|
271
|
+
obj.assign(obj)
|
272
|
+
obj.snapshot.must_equal [1, 2, 3, 4, 5]
|
273
|
+
end
|
269
274
|
end
|
270
275
|
|
271
276
|
describe BinData::Array, "with :read_until" do
|
data/test/bits_test.rb
CHANGED
@@ -101,14 +101,14 @@ def generate_bit_classes_to_test(endian, signed)
|
|
101
101
|
|
102
102
|
(start .. 64).each do |nbits|
|
103
103
|
name = "#{base}#{nbits}"
|
104
|
-
name
|
104
|
+
name += "le" if endian == :little
|
105
105
|
obj = BinData.const_get(name).new
|
106
106
|
bits << [obj, nbits]
|
107
107
|
end
|
108
108
|
|
109
109
|
(start .. 64).each do |nbits|
|
110
110
|
name = "#{base}"
|
111
|
-
name
|
111
|
+
name += "Le" if endian == :little
|
112
112
|
obj = BinData.const_get(name).new(nbits: nbits)
|
113
113
|
bits << [obj, nbits]
|
114
114
|
end
|
data/test/buffer_test.rb
CHANGED
data/test/delayed_io_test.rb
CHANGED
@@ -99,7 +99,7 @@ describe BinData::DelayedIO, "subclassed with a single type" do
|
|
99
99
|
end
|
100
100
|
|
101
101
|
it "writes explicitly" do
|
102
|
-
io = StringIO.new "\001\002\003\004\005\006\007\010\011"
|
102
|
+
io = StringIO.new "\001\002\003\004\005\006\007\010\011".dup
|
103
103
|
obj = IntDelayedIO.new(3)
|
104
104
|
obj.write(io)
|
105
105
|
obj.write_now!
|
@@ -107,7 +107,7 @@ describe BinData::DelayedIO, "subclassed with a single type" do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
it "writes explicitly after setting abs_offset" do
|
110
|
-
io = StringIO.new "\001\002\003\004\005\006\007\010\011"
|
110
|
+
io = StringIO.new "\001\002\003\004\005\006\007\010\011".dup
|
111
111
|
obj = IntDelayedIO.new(7)
|
112
112
|
obj.write(io)
|
113
113
|
|
@@ -139,7 +139,7 @@ describe BinData::DelayedIO, "subclassed with multiple types" do
|
|
139
139
|
end
|
140
140
|
|
141
141
|
it "writes explicitly" do
|
142
|
-
io = StringIO.new "\001\002\003\004\005\006\007\010\011\012\013\014\015"
|
142
|
+
io = StringIO.new "\001\002\003\004\005\006\007\010\011\012\013\014\015".dup
|
143
143
|
obj = StringDelayedIO.new(str: "hello")
|
144
144
|
obj.write(io)
|
145
145
|
obj.write_now!
|
data/test/int_test.rb
CHANGED
data/test/offset_test.rb
CHANGED
@@ -74,9 +74,15 @@ describe BinData::Base, "offsets" do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "adjust offset when incorrect" do
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
w, $-w = $-w, false
|
78
|
+
|
79
|
+
begin
|
80
|
+
io.seek(2)
|
81
|
+
obj = TenByteOffsetBase.create(adjust_offset: 13)
|
82
|
+
obj.read(io).snapshot.must_equal data[2 + 13, 3]
|
83
|
+
ensure
|
84
|
+
$-w = w
|
85
|
+
end
|
80
86
|
end
|
81
87
|
|
82
88
|
it "succeeds when offset is correct" do
|
data/test/registry_test.rb
CHANGED
@@ -36,10 +36,16 @@ describe BinData::Registry do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "allows overriding of registered classes" do
|
39
|
-
|
40
|
-
r.register('A', B)
|
39
|
+
w, $-w = $-w, false
|
41
40
|
|
42
|
-
|
41
|
+
begin
|
42
|
+
r.register('A', A)
|
43
|
+
r.register('A', B)
|
44
|
+
|
45
|
+
r.lookup('a').must_equal B
|
46
|
+
ensure
|
47
|
+
$-w = w
|
48
|
+
end
|
43
49
|
end
|
44
50
|
|
45
51
|
it "converts CamelCase to underscores" do
|
data/test/stringz_test.rb
CHANGED
@@ -106,12 +106,12 @@ describe BinData::Stringz, "with max_length" do
|
|
106
106
|
end
|
107
107
|
|
108
108
|
it "trims values greater than max_length" do
|
109
|
-
obj.assign("
|
109
|
+
obj.assign("abcdefg")
|
110
110
|
obj.must_equal "abcd"
|
111
111
|
end
|
112
112
|
|
113
113
|
it "writes values greater than max_length" do
|
114
|
-
obj.assign("
|
114
|
+
obj.assign("abcdefg")
|
115
115
|
obj.to_binary_s.must_equal_binary "abcd\0"
|
116
116
|
end
|
117
117
|
|
data/test/system_test.rb
CHANGED
@@ -360,3 +360,37 @@ describe BinData::Record, "with boolean parameters" do
|
|
360
360
|
obj.a.must_equal 2
|
361
361
|
end
|
362
362
|
end
|
363
|
+
|
364
|
+
describe BinData::Record, "encoding" do
|
365
|
+
class EncodingTestBufferRecord < BinData::Record
|
366
|
+
endian :big
|
367
|
+
default_parameter length: 5
|
368
|
+
|
369
|
+
uint16 :num
|
370
|
+
string :str, length: 10
|
371
|
+
end
|
372
|
+
|
373
|
+
it "returns binary encoded data" do
|
374
|
+
obj = EncodingTestBufferRecord.new(num: 3)
|
375
|
+
obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
|
376
|
+
end
|
377
|
+
|
378
|
+
it "returns binary encoded data with utf-8 string" do
|
379
|
+
obj = EncodingTestBufferRecord.new(num: 3, str: "日本語")
|
380
|
+
obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
|
381
|
+
end
|
382
|
+
|
383
|
+
it "returns binary encoded data despite Encoding.default_internal" do
|
384
|
+
w, $-w = $-w, false
|
385
|
+
before_enc = Encoding.default_internal
|
386
|
+
|
387
|
+
begin
|
388
|
+
Encoding.default_internal = Encoding::UTF_8
|
389
|
+
obj = EncodingTestBufferRecord.new(num: 3, str: "日本語")
|
390
|
+
obj.to_binary_s.encoding.must_equal Encoding::ASCII_8BIT
|
391
|
+
ensure
|
392
|
+
Encoding.default_internal = before_enc
|
393
|
+
$-w = w
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bindata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dion Mendel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -31,6 +31,9 @@ dependencies:
|
|
31
31
|
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 5.0.0
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 5.12.0
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -38,6 +41,9 @@ dependencies:
|
|
38
41
|
- - ">"
|
39
42
|
- !ruby/object:Gem::Version
|
40
43
|
version: 5.0.0
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 5.12.0
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: coveralls
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,7 +149,7 @@ files:
|
|
143
149
|
- test/uint8_array_test.rb
|
144
150
|
- test/virtual_test.rb
|
145
151
|
- test/warnings_test.rb
|
146
|
-
homepage:
|
152
|
+
homepage: https://github.com/dmendel/bindata
|
147
153
|
licenses:
|
148
154
|
- Ruby
|
149
155
|
metadata: {}
|
@@ -164,8 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
170
|
- !ruby/object:Gem::Version
|
165
171
|
version: '0'
|
166
172
|
requirements: []
|
167
|
-
|
168
|
-
rubygems_version: 2.7.6
|
173
|
+
rubygems_version: 3.1.4
|
169
174
|
signing_key:
|
170
175
|
specification_version: 4
|
171
176
|
summary: A declarative way to read and write binary file formats
|