BitStructEx 0.0.65 → 0.0.74

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.
@@ -2,36 +2,21 @@
2
2
  module BitStruct
3
3
 
4
4
  # Implements access to a 'segment' of a byte string, specified by
5
- # offset (from bit 0) and length (in bits). Supports little and big
6
- # endian data input and output.
5
+ # offset (from bit 0) and length (in bits).
7
6
  #
8
7
  # NOTE: This is highly inefficient. If a segment is byte-aligned,
9
8
  # please use the optimized ByteSlicer class.
9
+ #
10
+ # NOTE: Oops! Haven't implemented the ByteSlicer, yet! :)
11
+ #
10
12
  class BitSlicer
11
13
 
12
- module Endianess
13
- LITTLE_ENDIAN = LITTLE = INTEL = 0
14
- BIG_ENDIAN = BIG = MOTOROLA = 1
15
- NETWORK_BYTE_ORDER = BIG_ENDIAN
16
- end
14
+ attr_accessor :data
17
15
 
18
- include Endianess
19
-
20
- def initialize( bit_offset, bit_length, endianess = MOTOROLA )
16
+ def initialize( bit_offset, bit_length )
21
17
  raise ArgumentError if bit_offset < 0 || bit_length < 0
22
-
23
18
  @bit_offset = bit_offset
24
19
  @bit_length = bit_length
25
- @endianess = endianess
26
- end
27
-
28
- def data=( new_data )
29
- raise ArgumentError if ( @bit_offset + @bit_length ) > new_data.length * 8
30
- @data = new_data
31
- end
32
-
33
- def data
34
- @data
35
20
  end
36
21
 
37
22
  def get_bytes
@@ -88,13 +73,11 @@ module BitStruct
88
73
  #private
89
74
 
90
75
  def get_data( idx )
91
- return @data[ idx ] if @endianess == MOTOROLA
92
- return @data[ -idx ] if @endianess == INTEL
76
+ @data[ idx ]
93
77
  end
94
78
 
95
79
  def set_data( idx, val )
96
- @data[ idx ] = val if @endianess == MOTOROLA
97
- @data[ -idx ] = val if @endianess == INTEL
80
+ @data[ idx ] = val
98
81
  end
99
82
 
100
83
  def first_byte
@@ -0,0 +1,56 @@
1
+
2
+ module BitStruct
3
+
4
+ class ByteData
5
+
6
+ LITTLE_ENDIAN = LITTLE = INTEL = 0
7
+ BIG_ENDIAN = BIG = MOTOROLA = 1
8
+ NETWORK_BYTE_ORDER = BIG_ENDIAN
9
+
10
+ def initialize( data, endianess = nil )
11
+ raise "Bad input" unless data.respond_to? "[]".to_sym
12
+ raise "Unknown endianess" unless valid endianess
13
+ @data = data
14
+ @endianess = endianess || BIG_ENDIAN
15
+ end
16
+
17
+ def size
18
+ @data.size
19
+ end
20
+
21
+ def length
22
+ @data.length
23
+ end
24
+
25
+ def each
26
+ 0.upto( size - 1 ) { |idx| yield self[ idx ] }
27
+ end
28
+
29
+ def to_s
30
+ str = ''
31
+ each { |b| str << b }
32
+ str
33
+ end
34
+
35
+ def []( idx )
36
+ @data[ endianized( idx ) ]
37
+ end
38
+
39
+ def []=( idx, val )
40
+ @data[ endianized( idx ) ] = val
41
+ end
42
+
43
+ private
44
+
45
+ def valid( endianess )
46
+ endianess == nil || endianess == LITTLE_ENDIAN || endianess == BIG_ENDIAN
47
+ end
48
+
49
+ def endianized( idx )
50
+ return idx if @endianess == BIG_ENDIAN
51
+ return @data.length - idx - 1 if @endianess == LITTLE_ENDIAN
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -8,6 +8,7 @@ module BitStruct
8
8
  def initialize( name, nested_class, description = nil )
9
9
  super name, nil, description
10
10
  @nested_class = nested_class
11
+ @nested = nested_class.new
11
12
  end
12
13
 
13
14
  def length
@@ -16,7 +17,8 @@ module BitStruct
16
17
 
17
18
  def read( slicer )
18
19
  bytes = slicer.get_bytes
19
- @nested_class.new bytes
20
+ @nested.set_data bytes
21
+ @nested
20
22
  end
21
23
 
22
24
  def write( slicer, new_value )
@@ -1,5 +1,6 @@
1
1
 
2
2
  require 'bit_struct/bit_slicer'
3
+ require 'bit_struct/byte_data'
3
4
  require 'bit_struct/field'
4
5
 
5
6
  # The BitStruct module primarily provides the StructBase class, which in turn
@@ -8,27 +9,28 @@ require 'bit_struct/field'
8
9
  #
9
10
  # Example:
10
11
  #
11
- # class Flags < StructBase
12
- # unsigned :direction, 4
13
- # unsigned :multiplier, 2
14
- # unsigned :offset, 2
15
- # end
12
+ # class Flags < StructBase
13
+ # unsigned :direction, 4
14
+ # unsigned :multiplier, 2
15
+ # unsigned :offset, 2
16
+ # end
16
17
  #
17
- # class Entry < StructBase
18
- # unsigned :offset, 4
19
- # nested :flags, Flags
20
- # unsigned :address, 24
21
- # unsigned :cache_id, 16
22
- # end
18
+ # class Entry < StructBase
19
+ # unsigned :offset, 4
20
+ # nested :flags, Flags
21
+ # unsigned :address, 24
22
+ # unsigned :cache_id, 16
23
+ # end
23
24
  #
24
- # In contrast to the already available
25
+ # Then use it like this:
26
+ #
27
+ # entry = Entry.new some_data
28
+ # entry.offset
29
+ #
30
+ # NOTE: In contrast to the already available
25
31
  # http://raa.ruby-lang.org/project/bit-struct/ implementation, BitStructEx
26
32
  # allows nested structures which are not aligned on byte boundaries.
27
33
  #
28
- # Author:: Daniel Lukic (mailto:bitstructex@berlinfactor.com)
29
- # Copyright:: Copyright (c) 2005 The.Berlin.Factor
30
- # License:: Distributes under the GPL
31
- #
32
34
  module BitStruct
33
35
 
34
36
  # Define a subclass of StructBase and use the available field types (at
@@ -41,14 +43,25 @@ module BitStruct
41
43
  # Please see the provided examples in the samples folder for.. well..
42
44
  # examples.
43
45
  #
44
- class StructBase < String
46
+ # NOTE: You may ask 'What examples?'. And right you are, I haven't written
47
+ # any examples, yet.. Sorry.. :)
48
+ #
49
+ class StructBase
45
50
 
46
- def initialize( data = nil )
47
- @data = data
51
+ attr_reader :data
52
+
53
+ def initialize( initial_data = nil, endianess = nil )
54
+ set_data initial_data, endianess if initial_data
48
55
  end
49
56
 
50
- def data
51
- @data
57
+ def set_data( new_data, endianess = nil )
58
+ raise "No data?" unless new_data
59
+ if new_data.is_a? ByteData
60
+ raise "Cannot change endianess of ByteData object" if endianess
61
+ @data = new_Data
62
+ else new_data
63
+ @data = ByteData.new new_data, endianess
64
+ end
52
65
  end
53
66
 
54
67
  class << self
@@ -71,6 +84,7 @@ module BitStruct
71
84
  slicer.data = @data
72
85
  field.send :read, slicer
73
86
  end
87
+
74
88
  define_method "#{field.name}=" do |val|
75
89
  slicer = context.send :get_slicer_for, field
76
90
  slicer.data = @data
metadata CHANGED
@@ -3,16 +3,16 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: BitStructEx
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.65
7
- date: 2006-04-13 00:00:00 +02:00
6
+ version: 0.0.74
7
+ date: 2006-05-06 00:00:00 +02:00
8
8
  summary: Simple DSL for defining bit-based structures on byte data.
9
9
  require_paths:
10
- - src/ruby
10
+ - src
11
11
  email: tfdj {AT} berlinfactor {DOT} com
12
12
  homepage: bit-struct-ex.rubyforge.org.
13
13
  rubyforge_project: bit-struct-ex
14
14
  description: "Allows the specification of bit-based structures and provides an intuitive way of access data. Example: class Flags < StructBase unsigned :direction, 4 unsigned :multiplier, 2 unsigned :offset, 2 end class Entry < StructBase unsigned :offset, 4 nested :flags, Flags unsigned :address, 24 unsigned :cache_id, 16 end In contrast to the already available http://raa.ruby-lang.org/project/bit-struct/ implementation, BitStructEx allows nested structures which are not aligned on byte boundaries."
15
- autorequire: bit_struct/struct_base
15
+ autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
18
  has_rdoc: true
@@ -28,12 +28,15 @@ cert_chain:
28
28
  authors:
29
29
  - The.French.DJ
30
30
  files:
31
- - src/ruby/bit_struct/bit_slicer.rb
32
- - src/ruby/bit_struct/field.rb
33
- - src/ruby/bit_struct/nested.rb
34
- - src/ruby/bit_struct/struct_base.rb
35
- - src/ruby/bit_struct/text.rb
36
- - src/ruby/bit_struct/unsigned.rb
31
+ - src/bit_struct
32
+ - src/rake
33
+ - src/bit_struct/bit_slicer.rb
34
+ - src/bit_struct/byte_data.rb
35
+ - src/bit_struct/field.rb
36
+ - src/bit_struct/nested.rb
37
+ - src/bit_struct/struct_base.rb
38
+ - src/bit_struct/text.rb
39
+ - src/bit_struct/unsigned.rb
37
40
  test_files: []
38
41
 
39
42
  rdoc_options: []
File without changes
File without changes
File without changes