bin_struct 0.1.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -2
- data/README.md +8 -2
- data/lib/bin_struct/abstract_tlv.rb +75 -73
- data/lib/bin_struct/array.rb +35 -26
- data/lib/bin_struct/cstring.rb +64 -12
- data/lib/bin_struct/enum.rb +35 -25
- data/lib/bin_struct/int.rb +59 -77
- data/lib/bin_struct/int_string.rb +20 -13
- data/lib/bin_struct/length_from.rb +6 -6
- data/lib/bin_struct/oui.rb +13 -10
- data/lib/bin_struct/string.rb +26 -13
- data/lib/bin_struct/struct.rb +628 -0
- data/lib/bin_struct/{fieldable.rb → structable.rb} +15 -15
- data/lib/bin_struct/version.rb +2 -1
- data/lib/bin_struct.rb +2 -2
- metadata +4 -4
- data/lib/bin_struct/fields.rb +0 -612
data/lib/bin_struct/int.rb
CHANGED
@@ -9,10 +9,10 @@
|
|
9
9
|
module BinStruct
|
10
10
|
# Base integer class to handle binary integers
|
11
11
|
# @abstract
|
12
|
-
# @author Sylvain Daubert
|
12
|
+
# @author Sylvain Daubert (2016-2024)
|
13
13
|
# @author LemonTree55
|
14
14
|
class Int
|
15
|
-
include
|
15
|
+
include Structable
|
16
16
|
|
17
17
|
# Integer value
|
18
18
|
# @return [Integer,nil]
|
@@ -21,22 +21,22 @@ module BinStruct
|
|
21
21
|
# @return [:little,:big,:native,nil]
|
22
22
|
attr_accessor :endian
|
23
23
|
# Integer size, in bytes
|
24
|
-
# @return [Integer
|
24
|
+
# @return [Integer]
|
25
25
|
attr_accessor :width
|
26
26
|
# Integer default value
|
27
27
|
# @return [Integer]
|
28
28
|
attr_accessor :default
|
29
29
|
|
30
30
|
# @param [Hash] options
|
31
|
-
# @option options [Integer, nil] :value
|
32
|
-
# @option options [:little,:big,nil] :endian
|
33
|
-
# @option options [Integer,nil] :width
|
34
|
-
# @option options [Integer] :default
|
31
|
+
# @option options [Integer, nil] :value Value to set Int to
|
32
|
+
# @option options [:little,:big,:native,nil] :endian Int's endianess
|
33
|
+
# @option options [Integer,nil] :width Int's width in bytes
|
34
|
+
# @option options [Integer] :default Default value to use when {#value} is not set (Default to +0+).
|
35
35
|
# @author LemonTree55
|
36
36
|
def initialize(options = {})
|
37
37
|
@value = options[:value]
|
38
38
|
@endian = options[:endian]
|
39
|
-
@width = options[:width]
|
39
|
+
@width = options[:width] || 0
|
40
40
|
@default = options[:default] || 0
|
41
41
|
end
|
42
42
|
|
@@ -69,6 +69,7 @@ module BinStruct
|
|
69
69
|
end
|
70
70
|
alias to_human to_i
|
71
71
|
|
72
|
+
# Initialize value from an Integer.
|
72
73
|
# @param [Integer] value
|
73
74
|
# @return [self]
|
74
75
|
def from_human(value)
|
@@ -88,8 +89,8 @@ module BinStruct
|
|
88
89
|
width
|
89
90
|
end
|
90
91
|
|
91
|
-
# Format Int type when inspecting
|
92
|
-
# @return [String]
|
92
|
+
# Format Int type when inspecting Struct
|
93
|
+
# @return [::String]
|
93
94
|
def format_inspect
|
94
95
|
format_str % [to_i.to_s, to_i]
|
95
96
|
end
|
@@ -108,12 +109,10 @@ module BinStruct
|
|
108
109
|
end
|
109
110
|
|
110
111
|
# One byte unsigned integer
|
111
|
-
# @author Sylvain Daubert
|
112
112
|
# @author LemonTree55
|
113
113
|
class Int8 < Int
|
114
114
|
# @param [Hash] options
|
115
115
|
# @option options [Integer,nil] :value
|
116
|
-
# @author LemonTree55
|
117
116
|
def initialize(options = {})
|
118
117
|
options[:endian] = nil
|
119
118
|
options[:width] = 1
|
@@ -123,12 +122,10 @@ module BinStruct
|
|
123
122
|
end
|
124
123
|
|
125
124
|
# One byte signed integer
|
126
|
-
# @author Sylvain Daubert
|
127
125
|
# @author LemonTree55
|
128
126
|
class SInt8 < Int
|
129
127
|
# @param [Hash] options
|
130
128
|
# @option options [Integer,nil] :value
|
131
|
-
# @author LemonTree55
|
132
129
|
def initialize(options = {})
|
133
130
|
options[:endian] = nil
|
134
131
|
options[:width] = 1
|
@@ -138,12 +135,12 @@ module BinStruct
|
|
138
135
|
end
|
139
136
|
|
140
137
|
# 2-byte unsigned integer
|
141
|
-
# @author Sylvain Daubert
|
138
|
+
# @author Sylvain Daubert (2016-2024)
|
142
139
|
# @author LemonTree55
|
143
140
|
class Int16 < Int
|
144
141
|
# @param [Hash] options
|
145
142
|
# @option options [Integer,nil] :value
|
146
|
-
# @option [:big
|
143
|
+
# @option options [:big,:little,:native] :endian
|
147
144
|
def initialize(options = {})
|
148
145
|
opts = { value: options[:value], endian: options[:endian] || :big, width: 2 }
|
149
146
|
super(opts)
|
@@ -151,17 +148,16 @@ module BinStruct
|
|
151
148
|
end
|
152
149
|
end
|
153
150
|
|
154
|
-
#
|
155
|
-
# @author Sylvain Daubert
|
151
|
+
# Big endian 2-byte unsigned integer
|
152
|
+
# @author Sylvain Daubert (2016-2024)
|
156
153
|
class Int16be < Int16
|
157
154
|
undef endian=
|
158
155
|
end
|
159
156
|
|
160
|
-
#
|
161
|
-
# @author Sylvain Daubert
|
157
|
+
# Little endian 2-byte unsigned integer
|
158
|
+
# @author Sylvain Daubert (2016-2024)
|
162
159
|
# @author LemonTree55
|
163
160
|
class Int16le < Int16
|
164
|
-
# @param [Integer,nil] value
|
165
161
|
undef endian=
|
166
162
|
|
167
163
|
# @param [Hash] options
|
@@ -172,16 +168,13 @@ module BinStruct
|
|
172
168
|
end
|
173
169
|
end
|
174
170
|
|
175
|
-
#
|
176
|
-
# @author Sylvain Daubert
|
171
|
+
# Native endian 2-byte unsigned integer
|
177
172
|
# @author LemonTree55
|
178
173
|
class Int16n < Int16
|
179
|
-
# @param [Integer,nil] value
|
180
174
|
undef endian=
|
181
175
|
|
182
176
|
# @param [Hash] options
|
183
177
|
# @option options [Integer,nil] :value
|
184
|
-
# @author LemonTree55
|
185
178
|
def initialize(options = {})
|
186
179
|
opts = { value: options[:value], endian: :native }
|
187
180
|
super(opts)
|
@@ -189,12 +182,12 @@ module BinStruct
|
|
189
182
|
end
|
190
183
|
|
191
184
|
# 2-byte signed integer
|
192
|
-
# @author Sylvain Daubert
|
185
|
+
# @author Sylvain Daubert (2016-2024)
|
193
186
|
# @author LemonTree55
|
194
187
|
class SInt16 < Int16
|
195
188
|
# @param [Hash] options
|
196
189
|
# @option options [Integer,nil] :value
|
197
|
-
# @
|
190
|
+
# @option options [:big,:little,:native] :endian
|
198
191
|
def initialize(options = {})
|
199
192
|
opts = { value: options[:value], endian: options[:endian] || :big }
|
200
193
|
super(opts)
|
@@ -202,20 +195,20 @@ module BinStruct
|
|
202
195
|
end
|
203
196
|
end
|
204
197
|
|
205
|
-
#
|
206
|
-
# @author Sylvain Daubert
|
198
|
+
# Big endian 2-byte signed integer
|
199
|
+
# @author Sylvain Daubert (2016-2024)
|
207
200
|
class SInt16be < SInt16
|
208
201
|
undef endian=
|
209
202
|
end
|
210
203
|
|
211
|
-
#
|
212
|
-
# @author Sylvain Daubert
|
204
|
+
# Little endian 2-byte signed integer
|
205
|
+
# @author Sylvain Daubert (2016-2024)
|
213
206
|
# @author LemonTree55
|
214
207
|
class SInt16le < SInt16
|
215
|
-
# @param [Integer,nil] value
|
216
208
|
undef endian=
|
217
209
|
|
218
|
-
# @param [
|
210
|
+
# @param [Hash] options
|
211
|
+
# @option options [Integer,nil] :value
|
219
212
|
# @author LemonTree55
|
220
213
|
def initialize(options = {})
|
221
214
|
opts = { value: options[:value], endian: :little }
|
@@ -223,15 +216,14 @@ module BinStruct
|
|
223
216
|
end
|
224
217
|
end
|
225
218
|
|
226
|
-
#
|
227
|
-
# @author Sylvain Daubert
|
219
|
+
# Native endian 2-byte signed integer
|
220
|
+
# @author Sylvain Daubert (2016-2024)
|
228
221
|
# @author LemonTree55
|
229
222
|
class SInt16n < SInt16
|
230
|
-
# @param [Integer,nil] value
|
231
223
|
undef endian=
|
232
224
|
|
233
|
-
# @param [
|
234
|
-
# @
|
225
|
+
# @param [Hash] options
|
226
|
+
# @option options [Integer,nil] :value
|
235
227
|
def initialize(options = {})
|
236
228
|
opts = { value: options[:value], endian: :native }
|
237
229
|
super(opts)
|
@@ -259,8 +251,8 @@ module BinStruct
|
|
259
251
|
super(opts)
|
260
252
|
end
|
261
253
|
|
262
|
-
# Read
|
263
|
-
# @param [String]
|
254
|
+
# Read a 3-byte Int from a binary string
|
255
|
+
# @param [::String] value
|
264
256
|
# @return [self]
|
265
257
|
def read(value)
|
266
258
|
return self if value.nil?
|
@@ -275,7 +267,7 @@ module BinStruct
|
|
275
267
|
self
|
276
268
|
end
|
277
269
|
|
278
|
-
# @author Sylvain Daubert
|
270
|
+
# @author Sylvain Daubert (2016-2024)
|
279
271
|
# @return [::String]
|
280
272
|
def to_s
|
281
273
|
up8 = to_i >> 16
|
@@ -288,16 +280,15 @@ module BinStruct
|
|
288
280
|
end
|
289
281
|
end
|
290
282
|
|
291
|
-
#
|
292
|
-
# @author Sylvain Daubert
|
283
|
+
# Big endian 3-byte unsigned integer
|
284
|
+
# @author Sylvain Daubert (2016-2024)
|
293
285
|
class Int24be < Int24
|
294
286
|
undef endian=
|
295
287
|
end
|
296
288
|
|
297
|
-
#
|
289
|
+
# Little endian 3-byte unsigned integer
|
298
290
|
# @author LemonTree55
|
299
291
|
class Int24le < Int24
|
300
|
-
# @param [Integer,nil] value
|
301
292
|
undef endian=
|
302
293
|
|
303
294
|
# @param [Hash] options
|
@@ -308,10 +299,9 @@ module BinStruct
|
|
308
299
|
end
|
309
300
|
end
|
310
301
|
|
311
|
-
#
|
302
|
+
# Native endian 3-byte unsigned integer
|
312
303
|
# @author LemonTree55
|
313
304
|
class Int24n < Int24
|
314
|
-
# @param [Integer,nil] value
|
315
305
|
undef endian=
|
316
306
|
|
317
307
|
# @param [Hash] options
|
@@ -327,7 +317,7 @@ module BinStruct
|
|
327
317
|
class Int32 < Int
|
328
318
|
# @param [Hash] options
|
329
319
|
# @option options [Integer,nil] :value
|
330
|
-
# @option [:big
|
320
|
+
# @option options [:big,:little,:native] :endian
|
331
321
|
def initialize(options = {})
|
332
322
|
opts = { value: options[:value], endian: options[:endian] || :big, width: 4 }
|
333
323
|
super(opts)
|
@@ -335,16 +325,15 @@ module BinStruct
|
|
335
325
|
end
|
336
326
|
end
|
337
327
|
|
338
|
-
#
|
339
|
-
# @author Sylvain Daubert
|
328
|
+
# Big endian 4-byte unsigned integer
|
329
|
+
# @author Sylvain Daubert (2016-2024)
|
340
330
|
class Int32be < Int32
|
341
331
|
undef endian=
|
342
332
|
end
|
343
333
|
|
344
|
-
#
|
334
|
+
# Little endian 4-byte unsigned integer
|
345
335
|
# @author LemonTree55
|
346
336
|
class Int32le < Int32
|
347
|
-
# @param [Integer,nil] value
|
348
337
|
undef endian=
|
349
338
|
|
350
339
|
# @param [Hash] options
|
@@ -355,10 +344,9 @@ module BinStruct
|
|
355
344
|
end
|
356
345
|
end
|
357
346
|
|
358
|
-
#
|
347
|
+
# Native endian 4-byte unsigned integer
|
359
348
|
# @author LemonTree55
|
360
349
|
class Int32n < Int32
|
361
|
-
# @param [Integer,nil] value
|
362
350
|
undef endian=
|
363
351
|
|
364
352
|
# @param [Hash] options
|
@@ -369,12 +357,12 @@ module BinStruct
|
|
369
357
|
end
|
370
358
|
end
|
371
359
|
|
372
|
-
# 4-byte
|
360
|
+
# 4-byte signed integer
|
373
361
|
# @author LemonTree55
|
374
362
|
class SInt32 < Int32
|
375
363
|
# @param [Hash] options
|
376
364
|
# @option options [Integer] :value
|
377
|
-
# @option options [:big
|
365
|
+
# @option options [:big,:little,:native] :endian
|
378
366
|
def initialize(options = {})
|
379
367
|
opts = { value: options[:value], endian: options[:endian] || :big }
|
380
368
|
super(opts)
|
@@ -382,16 +370,15 @@ module BinStruct
|
|
382
370
|
end
|
383
371
|
end
|
384
372
|
|
385
|
-
#
|
386
|
-
# @author Sylvain Daubert
|
373
|
+
# Big endian 4-byte signed integer
|
374
|
+
# @author Sylvain Daubert (2016-2024)
|
387
375
|
class SInt32be < SInt32
|
388
376
|
undef endian=
|
389
377
|
end
|
390
378
|
|
391
|
-
#
|
379
|
+
# Little endian 4-byte signed integer
|
392
380
|
# @author LemonTree55
|
393
381
|
class SInt32le < SInt32
|
394
|
-
# @param [Integer,nil] value
|
395
382
|
undef endian=
|
396
383
|
|
397
384
|
# @param [Hash] options
|
@@ -402,10 +389,9 @@ module BinStruct
|
|
402
389
|
end
|
403
390
|
end
|
404
391
|
|
405
|
-
#
|
392
|
+
# Native endian 4-byte signed integer
|
406
393
|
# @author LemonTree55
|
407
394
|
class SInt32n < SInt32
|
408
|
-
# @param [Integer,nil] value
|
409
395
|
undef endian=
|
410
396
|
|
411
397
|
# @param [Hash] options
|
@@ -421,7 +407,7 @@ module BinStruct
|
|
421
407
|
class Int64 < Int
|
422
408
|
# @param [Hash] options
|
423
409
|
# @option options [Integer] :value
|
424
|
-
# @option options [:big
|
410
|
+
# @option options [:big,:little,:native] :endian
|
425
411
|
def initialize(options = {})
|
426
412
|
opts = options.slice(:value, :endian)
|
427
413
|
opts[:endian] ||= :big
|
@@ -431,16 +417,15 @@ module BinStruct
|
|
431
417
|
end
|
432
418
|
end
|
433
419
|
|
434
|
-
#
|
435
|
-
# @author Sylvain Daubert
|
420
|
+
# Big endian 8-byte unsigned integer
|
421
|
+
# @author Sylvain Daubert (2016-2024)
|
436
422
|
class Int64be < Int64
|
437
423
|
undef endian=
|
438
424
|
end
|
439
425
|
|
440
|
-
#
|
426
|
+
# Little endian 8-byte unsigned integer
|
441
427
|
# @author LemonTree55
|
442
428
|
class Int64le < Int64
|
443
|
-
# @param [Integer,nil] value
|
444
429
|
undef endian=
|
445
430
|
|
446
431
|
# @param [Hash] options
|
@@ -451,10 +436,9 @@ module BinStruct
|
|
451
436
|
end
|
452
437
|
end
|
453
438
|
|
454
|
-
#
|
439
|
+
# Native endian 8-byte unsigned integer
|
455
440
|
# @author LemonTree55
|
456
441
|
class Int64n < Int64
|
457
|
-
# @param [Integer,nil] value
|
458
442
|
undef endian=
|
459
443
|
|
460
444
|
# @param [Hash] options
|
@@ -465,12 +449,12 @@ module BinStruct
|
|
465
449
|
end
|
466
450
|
end
|
467
451
|
|
468
|
-
# 8-byte
|
452
|
+
# 8-byte signed integer
|
469
453
|
# @author LemonTree55
|
470
454
|
class SInt64 < Int64
|
471
455
|
# @param [Hash] options
|
472
456
|
# @option options [Integer] :value
|
473
|
-
# @option options [:big
|
457
|
+
# @option options [:big,:little,:native] :endian
|
474
458
|
def initialize(options = {})
|
475
459
|
opts = options.slice(:value, :endian)
|
476
460
|
super(opts)
|
@@ -478,16 +462,15 @@ module BinStruct
|
|
478
462
|
end
|
479
463
|
end
|
480
464
|
|
481
|
-
#
|
482
|
-
# @author Sylvain Daubert
|
465
|
+
# Big endian 8-byte signed integer
|
466
|
+
# @author Sylvain Daubert (2016-2024)
|
483
467
|
class SInt64be < SInt64
|
484
468
|
undef endian=
|
485
469
|
end
|
486
470
|
|
487
|
-
#
|
471
|
+
# Little endian 8-byte signed integer
|
488
472
|
# @author LemonTree55
|
489
473
|
class SInt64le < SInt64
|
490
|
-
# @param [Integer,nil] value
|
491
474
|
undef endian=
|
492
475
|
|
493
476
|
# @param [Hash] options
|
@@ -498,10 +481,9 @@ module BinStruct
|
|
498
481
|
end
|
499
482
|
end
|
500
483
|
|
501
|
-
#
|
484
|
+
# Native endian 8-byte signed integer
|
502
485
|
# @author LemonTree55
|
503
486
|
class SInt64n < SInt64
|
504
|
-
# @param [Integer,nil] value
|
505
487
|
undef endian=
|
506
488
|
|
507
489
|
# @param [Hash] options
|
@@ -7,27 +7,29 @@
|
|
7
7
|
# This program is published under MIT license.
|
8
8
|
|
9
9
|
module BinStruct
|
10
|
-
# Provides a class for creating strings preceeded by their length as
|
10
|
+
# Provides a class for creating strings preceeded by their length as an {Int}.
|
11
11
|
# By default, a null string will have one byte length (length byte set to 0).
|
12
|
-
# @author Sylvain Daubert
|
12
|
+
# @author Sylvain Daubert (2016-2024)
|
13
|
+
# @author LemonTree55
|
13
14
|
class IntString
|
14
|
-
include
|
15
|
+
include Structable
|
15
16
|
|
16
17
|
# internal string
|
17
|
-
# @return [String]
|
18
|
+
# @return [::String]
|
18
19
|
attr_reader :string
|
19
20
|
|
20
21
|
# @param [Hash] options
|
21
22
|
# @option options [Class] :length_type should be a {Int} subclass. Default to {Int8}.
|
22
|
-
# @option options [::String] :
|
23
|
+
# @option options [::String] :value String value. Default to +""+
|
23
24
|
def initialize(options = {})
|
24
|
-
@string = BinStruct::String.new.read(options[:
|
25
|
+
@string = BinStruct::String.new.read(options[:value] || +'')
|
25
26
|
@length = (options[:length_type] || Int8).new
|
26
27
|
calc_length
|
27
28
|
end
|
28
29
|
|
30
|
+
# Populate IntString from a binary String
|
29
31
|
# @param [::String] str
|
30
|
-
# @return [
|
32
|
+
# @return [self]
|
31
33
|
def read(str)
|
32
34
|
unless str[0, @length.width].size == @length.width
|
33
35
|
raise Error,
|
@@ -38,19 +40,25 @@ module BinStruct
|
|
38
40
|
self
|
39
41
|
end
|
40
42
|
|
43
|
+
# Set length
|
41
44
|
# @param [Integer] len
|
42
45
|
# @return [Integer]
|
43
46
|
def length=(len)
|
44
47
|
@length.from_human(len)
|
48
|
+
# rubocop:disable Lint/Void
|
49
|
+
len
|
50
|
+
# rubocop:enable Lint/Void
|
45
51
|
end
|
46
52
|
|
53
|
+
# Get length as registered in +IntLength+
|
47
54
|
# @return [Integer]
|
48
55
|
def length
|
49
56
|
@length.to_i
|
50
57
|
end
|
51
58
|
|
59
|
+
# Set string without setting {#length}
|
52
60
|
# @param [#to_s] str
|
53
|
-
# @return [String]
|
61
|
+
# @return [::String]
|
54
62
|
def string=(str)
|
55
63
|
@length.value = str.to_s.size
|
56
64
|
@string = str.to_s
|
@@ -63,17 +71,16 @@ module BinStruct
|
|
63
71
|
end
|
64
72
|
|
65
73
|
# Set from a human readable string
|
66
|
-
# @param [String] str
|
74
|
+
# @param [::String] str
|
67
75
|
# @return [self]
|
68
76
|
def from_human(str)
|
69
|
-
@string.read
|
77
|
+
@string.read(str)
|
70
78
|
calc_length
|
71
79
|
self
|
72
80
|
end
|
73
81
|
|
74
82
|
# Get human readable string
|
75
83
|
# @return [::String]
|
76
|
-
# @since 2.2.0
|
77
84
|
def to_human
|
78
85
|
@string
|
79
86
|
end
|
@@ -81,10 +88,10 @@ module BinStruct
|
|
81
88
|
# Set length from internal string length
|
82
89
|
# @return [Integer]
|
83
90
|
def calc_length
|
84
|
-
@length.
|
91
|
+
@length.from_human(@string.length)
|
85
92
|
end
|
86
93
|
|
87
|
-
# Give binary string length (including +length+
|
94
|
+
# Give binary string length (including +length+ attribute)
|
88
95
|
# @return [Integer]
|
89
96
|
def sz
|
90
97
|
to_s.size
|
@@ -10,16 +10,16 @@ module BinStruct
|
|
10
10
|
# This module is a mixin adding +length_from+ capacity to a type.
|
11
11
|
# +length_from+ capacity is the capacity, for a type, to gets its
|
12
12
|
# length from another object.
|
13
|
-
# @author Sylvain Daubert
|
14
|
-
# @
|
13
|
+
# @author Sylvain Daubert (2016-2024)
|
14
|
+
# @author LemonTree55
|
15
15
|
module LengthFrom
|
16
16
|
# Max value returned by {#sz_to_read}.
|
17
17
|
MAX_SZ_TO_READ = 65_535
|
18
18
|
|
19
|
-
# Initialize +
|
20
|
-
# Should be
|
19
|
+
# Initialize +length_from+ capacity.
|
20
|
+
# Should be called by extended object's initialize method.
|
21
21
|
# @param [Hash] options
|
22
|
-
# @option options [
|
22
|
+
# @option options [Int,Proc] :length_from object or proc from which
|
23
23
|
# takes length when reading
|
24
24
|
# @return [void]
|
25
25
|
def initialize_length_from(options)
|
@@ -28,7 +28,7 @@ module BinStruct
|
|
28
28
|
|
29
29
|
# Return a substring from +str+ of length given in another object.
|
30
30
|
# @param [#to_s] str
|
31
|
-
# @return [String]
|
31
|
+
# @return [::String]
|
32
32
|
def read_with_length_from(str)
|
33
33
|
s = BinStruct.force_binary(str.to_s)
|
34
34
|
s[0, sz_to_read]
|
data/lib/bin_struct/oui.rb
CHANGED
@@ -11,23 +11,26 @@ module BinStruct
|
|
11
11
|
# oui = OUI.new
|
12
12
|
# oui.from_human('00:01:02')
|
13
13
|
# oui.to_human # => "00:01:02"
|
14
|
-
#
|
15
|
-
|
16
|
-
|
14
|
+
# oui.to_s # => "\x00\x01\x03"
|
15
|
+
# @author Sylvain Daubert (2016-2024)
|
16
|
+
# @author LemonTree55
|
17
|
+
class OUI < Struct
|
18
|
+
include Structable
|
17
19
|
|
18
20
|
# @attribute b2
|
19
21
|
# @return [Integer] left-most byte
|
20
|
-
|
22
|
+
define_attr :b2, Int8
|
21
23
|
# @attribute b1
|
22
24
|
# @return [Integer] center byte
|
23
|
-
|
25
|
+
define_attr :b1, Int8
|
24
26
|
# @attribute b0
|
25
27
|
# @return [Integer] right-most byte
|
26
|
-
|
28
|
+
define_attr :b0, Int8
|
27
29
|
|
28
30
|
# Read a human-readable string to populate object
|
29
|
-
# @param [String] str
|
30
|
-
# @return [
|
31
|
+
# @param [::String] str
|
32
|
+
# @return [self]
|
33
|
+
# @raise [ArgumentError] OUI cannot be recognized from +str+
|
31
34
|
def from_human(str)
|
32
35
|
return self if str.nil?
|
33
36
|
|
@@ -41,9 +44,9 @@ module BinStruct
|
|
41
44
|
end
|
42
45
|
|
43
46
|
# Get OUI in human readable form (colon-separated bytes)
|
44
|
-
# @return [String]
|
47
|
+
# @return [::String]
|
45
48
|
def to_human
|
46
|
-
|
49
|
+
attributes.map { |m| '%02x' % self[m] }.join(':')
|
47
50
|
end
|
48
51
|
end
|
49
52
|
end
|
data/lib/bin_struct/string.rb
CHANGED
@@ -9,42 +9,49 @@
|
|
9
9
|
require 'forwardable'
|
10
10
|
|
11
11
|
module BinStruct
|
12
|
-
# This class mimics regular String, but it is {
|
13
|
-
# @author Sylvain Daubert
|
14
|
-
# @
|
12
|
+
# This class mimics regular String, but it is {Structable}.
|
13
|
+
# @author Sylvain Daubert (2016-2024)
|
14
|
+
# @author LemonTree55
|
15
15
|
class String
|
16
16
|
extend Forwardable
|
17
|
-
include
|
17
|
+
include Structable
|
18
18
|
include LengthFrom
|
19
19
|
|
20
|
-
def_delegators :@string, :[], :
|
20
|
+
def_delegators :@string, :[], :length, :size, :inspect, :==,
|
21
21
|
:unpack, :force_encoding, :encoding, :index, :empty?,
|
22
22
|
:encode, :slice, :slice!, :[]=
|
23
23
|
|
24
|
+
# Underlying Ruby String
|
24
25
|
# @return [::String]
|
25
26
|
attr_reader :string
|
27
|
+
# String static length, if set
|
26
28
|
# @return [Integer]
|
27
29
|
attr_reader :static_length
|
28
30
|
|
29
31
|
# @param [Hash] options
|
30
|
-
# @option options [
|
32
|
+
# @option options [Int,Proc] :length_from object or proc from which
|
31
33
|
# takes length when reading
|
32
34
|
# @option options [Integer] :static_length set a static length for this string
|
35
|
+
# @option options [::String] :value string value (default to +''+)
|
33
36
|
def initialize(options = {})
|
34
|
-
register_internal_string(+'')
|
37
|
+
register_internal_string(options[:value] || +'')
|
35
38
|
initialize_length_from(options)
|
36
39
|
@static_length = options[:static_length]
|
37
40
|
end
|
38
41
|
|
42
|
+
# Initialize object on copying:
|
43
|
+
# * duplicate underlying Ruby String
|
44
|
+
# @return [void]
|
39
45
|
def initialize_copy(_orig)
|
40
46
|
@string = @string.dup
|
41
47
|
end
|
42
48
|
|
49
|
+
# Populate String from a binary String. Limit length using {LengthFrom} or {#static_length}, if one is set.
|
43
50
|
# @param [::String] str
|
44
|
-
# @return [
|
51
|
+
# @return [self]
|
45
52
|
def read(str)
|
46
53
|
s = read_with_length_from(str)
|
47
|
-
register_internal_string
|
54
|
+
register_internal_string(s)
|
48
55
|
self
|
49
56
|
end
|
50
57
|
|
@@ -52,9 +59,8 @@ module BinStruct
|
|
52
59
|
private :old_sz_to_read
|
53
60
|
|
54
61
|
# Size to read.
|
55
|
-
# Computed from static_length or length_from
|
62
|
+
# Computed from {#static_length} or +length_from+, if one defined.
|
56
63
|
# @return [Integer]
|
57
|
-
# @since 3.1.6
|
58
64
|
def sz_to_read
|
59
65
|
return static_length if static_length?
|
60
66
|
|
@@ -63,11 +69,12 @@ module BinStruct
|
|
63
69
|
|
64
70
|
# Say if a static length is defined
|
65
71
|
# @return [Boolean]
|
66
|
-
# @since 3.1.6
|
67
72
|
def static_length?
|
68
73
|
!static_length.nil?
|
69
74
|
end
|
70
75
|
|
76
|
+
# Format String when inspecting from a {Struct}
|
77
|
+
# @return [::String]
|
71
78
|
def format_inspect
|
72
79
|
inspect
|
73
80
|
end
|
@@ -76,10 +83,16 @@ module BinStruct
|
|
76
83
|
# @param [#to_s] str
|
77
84
|
# @return [self]
|
78
85
|
def <<(str)
|
79
|
-
@string << str.to_s
|
86
|
+
@string << BinStruct.force_binary(str.to_s)
|
80
87
|
self
|
81
88
|
end
|
82
89
|
|
90
|
+
# Generate binary string
|
91
|
+
# @return [::String]
|
92
|
+
def to_s
|
93
|
+
@string
|
94
|
+
end
|
95
|
+
|
83
96
|
alias sz length
|
84
97
|
alias to_human to_s
|
85
98
|
alias from_human read
|