kaitai-struct 0.4 → 0.5

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kaitai/struct/struct.rb +37 -13
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 023b59d1105bf10850106f5bf1ace310c9d532b7
4
- data.tar.gz: 1ad3a5d47c5ce5be18b79bfbcd9910b1f0d9ed7b
3
+ metadata.gz: 17e1d21f8e7714894c503f0f2c6dade3d0f462c5
4
+ data.tar.gz: da8b07352f240d0291f148822d7fbeaaf8dbc7b0
5
5
  SHA512:
6
- metadata.gz: 5d5b1a4726c8c5c010baaca1cb771daf32762b84fd77cf408b91ebadd6e6a865d3fba69b32deb9618a3463e6c68789c2e9ec7cc401524939c729ab519b832457
7
- data.tar.gz: 0a3dc2c987d2a327bae5b0ecff06bde62c6039df1180416aad5f4d966fab8d618b0462f29d3f64e7858caee032b7c64f572b6a4579d74eaf461f89830c7f3d54
6
+ metadata.gz: 34a01006fb075a575e65af5a21118c5f17758a63dc0313d9c49ab0569ed2d14b93587b1d70be985b23d6795946a11ec6399c293bea800ae1c56e2cb6bf03d299
7
+ data.tar.gz: 323c1c0d0ff960c519ba089b40841ab3f28c4c53a821425d1402ba0f29ef8d91e9b1af4f019b7fa32d6886b86de6eba9045b968e83dd3cf46c1de99e6f1271c1
@@ -3,7 +3,7 @@ require 'stringio'
3
3
  module Kaitai
4
4
  module Struct
5
5
 
6
- VERSION = '0.4'
6
+ VERSION = '0.5'
7
7
 
8
8
  ##
9
9
  # Common base class for all structured generated by Kaitai Struct.
@@ -59,7 +59,7 @@ class Struct
59
59
  end
60
60
 
61
61
  ##
62
- # Kaitai::Stream is an implementation of
62
+ # Kaitai::Struct::Stream is an implementation of
63
63
  # {https://github.com/kaitai-io/kaitai_struct/wiki/Kaitai-Struct-stream-API
64
64
  # Kaitai Struct stream API} for Ruby. It's implemented as a wrapper
65
65
  # for generic IO objects.
@@ -358,31 +358,46 @@ class Stream
358
358
 
359
359
  ##
360
360
  # Performs a XOR processing with given data, XORing every byte of
361
- # input with a single given value.
361
+ # input with a single given value. Uses pure Ruby implementation suggested
362
+ # by [Thomas Leitner](https://github.com/gettalong), borrowed from
363
+ # https://github.com/fny/xorcist/blob/master/bin/benchmark
362
364
  # @param data [String] data to process
363
365
  # @param key [Fixnum] value to XOR with
364
366
  # @return [String] processed data
365
- def process_xor_one(data, key)
366
- data.bytes.map { |x| x ^ key }.pack('C*')
367
+ def self.process_xor_one(data, key)
368
+ out = data.dup
369
+ i = 0
370
+ max = data.length
371
+ while i < max
372
+ out.setbyte(i, data.getbyte(i) ^ key)
373
+ i += 1
374
+ end
375
+ out
367
376
  end
368
377
 
369
378
  ##
370
379
  # Performs a XOR processing with given data, XORing every byte of
371
380
  # input with a key array, repeating key array many times, if
372
381
  # necessary (i.e. if data array is longer than key array).
382
+ # Uses pure Ruby implementation suggested by
383
+ # [Thomas Leitner](https://github.com/gettalong), borrowed from
384
+ # https://github.com/fny/xorcist/blob/master/bin/benchmark
373
385
  # @param data [String] data to process
374
386
  # @param key [String] array of bytes to XOR with
375
387
  # @return [String] processed data
376
- def process_xor_many(data, key)
377
- kb = key.bytes
378
- kl = kb.size
388
+ def self.process_xor_many(data, key)
389
+ out = data.dup
390
+ kl = key.length
379
391
  ki = 0
380
- data.bytes.map { |x|
381
- r = x ^ kb[ki]
392
+ i = 0
393
+ max = data.length
394
+ while i < max
395
+ out.setbyte(i, data.getbyte(i) ^ key.getbyte(ki))
382
396
  ki += 1
383
397
  ki = 0 if ki >= kl
384
- r
385
- }.pack('C*')
398
+ i += 1
399
+ end
400
+ out
386
401
  end
387
402
 
388
403
  ##
@@ -394,7 +409,7 @@ class Stream
394
409
  # @param amount [Fixnum] number of bits to shift by
395
410
  # @param group_size [Fixnum] number of bytes per group to shift
396
411
  # @return [String] copy of source array with requested shift applied
397
- def process_rotate_left(data, amount, group_size)
412
+ def self.process_rotate_left(data, amount, group_size)
398
413
  raise NotImplementedError.new("unable to rotate group #{group_size} bytes yet") unless group_size == 1
399
414
 
400
415
  mask = group_size * 8 - 1
@@ -411,6 +426,15 @@ class Stream
411
426
 
412
427
  # ========================================================================
413
428
 
429
+ ##
430
+ # Resolves value using enum: if the value is not found in the map,
431
+ # we'll just use literal value per se.
432
+ def self.resolve_enum(enum_map, value)
433
+ enum_map[value] || value
434
+ end
435
+
436
+ # ========================================================================
437
+
414
438
  private
415
439
  SIGN_MASK_16 = (1 << (16 - 1))
416
440
  SIGN_MASK_32 = (1 << (32 - 1))
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.4'
4
+ version: '0.5'
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-08-09 00:00:00.000000000 Z
11
+ date: 2016-11-09 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.