kaitai-struct 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17e1d21f8e7714894c503f0f2c6dade3d0f462c5
4
- data.tar.gz: da8b07352f240d0291f148822d7fbeaaf8dbc7b0
3
+ metadata.gz: fb2b4ae17b2b8d26cecfe15e7e9ec6855be0d6f9
4
+ data.tar.gz: 9a1b9b1339dacda683de54c419522f093f7694e2
5
5
  SHA512:
6
- metadata.gz: 34a01006fb075a575e65af5a21118c5f17758a63dc0313d9c49ab0569ed2d14b93587b1d70be985b23d6795946a11ec6399c293bea800ae1c56e2cb6bf03d299
7
- data.tar.gz: 323c1c0d0ff960c519ba089b40841ab3f28c4c53a821425d1402ba0f29ef8d91e9b1af4f019b7fa32d6886b86de6eba9045b968e83dd3cf46c1de99e6f1271c1
6
+ metadata.gz: b93c930991c6978f41f16d74d0c273fba39142df82ef78a51497785b8fdee61e921a01d5e02e75373cde64556649c6e623897170fb5b6da9422e2a23ab54bfdd
7
+ data.tar.gz: 592c8dff971cd6d44ff65102f900b8a02c7f32982a1fd2576ab9ab68f64a9a4192c7bc98387dfa19b69acd32c43cbea2be7eb0309710bf667d1d42c681d915f6
data/.gitignore CHANGED
@@ -1 +1 @@
1
- /test/compiled
1
+ *.gem
@@ -3,7 +3,7 @@ require 'stringio'
3
3
  module Kaitai
4
4
  module Struct
5
5
 
6
- VERSION = '0.5'
6
+ VERSION = '0.6'
7
7
 
8
8
  ##
9
9
  # Common base class for all structured generated by Kaitai Struct.
@@ -99,6 +99,7 @@ class Stream
99
99
  else
100
100
  raise TypeError.new('can be initialized with IO or String only')
101
101
  end
102
+ align_to_byte
102
103
  end
103
104
 
104
105
  ##
@@ -274,6 +275,45 @@ class Stream
274
275
  read_bytes(8).unpack('E')[0]
275
276
  end
276
277
 
278
+ # ========================================================================
279
+ # Unaligned bit values
280
+ # ========================================================================
281
+
282
+ def align_to_byte
283
+ @bits_left = 0
284
+ @bits = 0
285
+ end
286
+
287
+ def read_bits_int(n)
288
+ bits_needed = n - @bits_left
289
+ if bits_needed > 0
290
+ # 1 bit => 1 byte
291
+ # 8 bits => 1 byte
292
+ # 9 bits => 2 bytes
293
+ bytes_needed = ((bits_needed - 1) / 8) + 1
294
+ buf = read_bytes(bytes_needed)
295
+ buf.each_byte { |byte|
296
+ @bits <<= 8
297
+ @bits |= byte
298
+ @bits_left += 8
299
+ }
300
+ end
301
+
302
+ # raw mask with required number of 1s, starting from lowest bit
303
+ mask = (1 << n) - 1
304
+ # shift mask to align with highest bits available in @bits
305
+ shift_bits = @bits_left - n
306
+ mask <<= shift_bits
307
+ # derive reading result
308
+ res = (@bits & mask) >> shift_bits
309
+ # clear top bits that we've just read => AND with 1s
310
+ @bits_left -= n
311
+ mask = (1 << @bits_left) - 1
312
+ @bits &= mask
313
+
314
+ res
315
+ end
316
+
277
317
  # ========================================================================
278
318
  # Byte arrays
279
319
  # ========================================================================
@@ -306,18 +346,15 @@ class Stream
306
346
  # Reads next len bytes from the stream and ensures that they match
307
347
  # expected fixed byte array. If they differ, throws a
308
348
  # {UnexpectedDataError} runtime exception.
309
- # @param len [Fixnum] number of bytes to read
310
349
  # @param expected [String] contents to be expected
311
350
  # @return [String] read bytes as byte array, which are guaranteed to
312
351
  # equal to expected
313
352
  # @raise [UnexpectedDataError]
314
- def ensure_fixed_contents(len, expected)
315
- buf = @_io.read(len)
316
- actual = buf.bytes
317
- if actual != expected
318
- raise UnexpectedDataError.new(actual, expected)
319
- end
320
- buf
353
+ def ensure_fixed_contents(expected)
354
+ len = expected.bytesize
355
+ actual = @_io.read(len)
356
+ raise UnexpectedDataError.new(actual, expected) if actual != expected
357
+ actual
321
358
  end
322
359
 
323
360
  # ========================================================================
@@ -445,7 +482,7 @@ class Stream
445
482
  end
446
483
 
447
484
  def self.format_hex(arr)
448
- arr.map { |x| sprintf('%02X', x) }.join(' ')
485
+ arr.unpack('H*')[0].gsub(/(..)/, '\1 ').chop
449
486
  end
450
487
  end
451
488
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kaitai-struct
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '0.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Yakshin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-09 00:00:00.000000000 Z
11
+ date: 2017-02-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Kaitai Struct is a declarative language used for describe various binary data structures, laid out in files or in memory: i.e. binary file formats, network stream packet formats, etc.
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
45
  version: '0'
46
46
  requirements: []
47
47
  rubyforge_project:
48
- rubygems_version: 2.5.1
48
+ rubygems_version: 2.5.2
49
49
  signing_key:
50
50
  specification_version: 4
51
51
  summary: 'Kaitai Struct: runtime library for Ruby'