BitStructEx 0.0.54 → 0.0.64
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.
- data/Rakefile +3 -1
- data/Version +1 -1
- data/src/ruby/bit_struct/struct_base.rb +1 -1
- data/src/ruby/bit_struct/text.rb +28 -0
- data/test/ruby/bit_struct/test_struct_base.rb +2 -0
- data/test/ruby/bit_struct/test_text.rb +54 -0
- data/test/ruby/bit_struct/test_text_struct.rb +58 -0
- data/test/ruby/runner.rb +12 -0
- metadata +4 -1
data/Rakefile
CHANGED
@@ -33,8 +33,10 @@ end
|
|
33
33
|
desc "Increment the build number and upate the Version file"
|
34
34
|
task :increment_build_number => [ :run_tests ] do
|
35
35
|
src = Dir.glob "#{SRC_DIR}/**/*"
|
36
|
+
test = Dir.glob "#{TEST_DIR}/**/*"
|
37
|
+
files = src + test
|
36
38
|
target = 'Version'
|
37
|
-
unless uptodate?( target,
|
39
|
+
unless uptodate?( target, files )
|
38
40
|
new_version = PKG_VERSION.increment( :build )
|
39
41
|
puts "Version: #{new_version}"
|
40
42
|
end
|
data/Version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.64
|
@@ -99,7 +99,7 @@ module BitStruct
|
|
99
99
|
require "bit_struct/#{symbol.id2name}"
|
100
100
|
|
101
101
|
class_name = make_class_name symbol
|
102
|
-
clazz =
|
102
|
+
clazz = eval "BitStruct::#{class_name.to_sym}"
|
103
103
|
self.class.send :define_method, symbol do |*args|
|
104
104
|
add_field clazz.new( *args )
|
105
105
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
require 'bit_struct/field'
|
3
|
+
|
4
|
+
module BitStruct
|
5
|
+
|
6
|
+
class TextField < Field
|
7
|
+
|
8
|
+
def initialize( name, length, description = nil )
|
9
|
+
raise "Length must be multiple of 8" unless ( length % 8 ) == 0
|
10
|
+
super name, length, description
|
11
|
+
@length_in_bytes = length / 8
|
12
|
+
end
|
13
|
+
|
14
|
+
def read( slicer )
|
15
|
+
res = ''
|
16
|
+
slicer.get_bytes.reverse.each { |b| res << b }
|
17
|
+
res
|
18
|
+
end
|
19
|
+
|
20
|
+
def write( slicer, new_value )
|
21
|
+
bytes = []
|
22
|
+
new_value.each_byte { |b| bytes << b }
|
23
|
+
slicer.set_bytes bytes.reverse
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
require 'bit_struct/text'
|
5
|
+
|
6
|
+
include BitStruct
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
class TestTextField < Test::Unit::TestCase
|
11
|
+
|
12
|
+
# Note: The TextField doesn't check the length. It is part of the
|
13
|
+
# contract between the field and the slicer that only the expected
|
14
|
+
# number of bytes (or less) are passed to the field :)
|
15
|
+
|
16
|
+
def test_initialize
|
17
|
+
TextField.new 'dummy', 8
|
18
|
+
TextField.new 'dummy', 16
|
19
|
+
TextField.new 'dummy', 24
|
20
|
+
assert_raise( RuntimeError ) { TextField.new 'dummy', 5 }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_read
|
24
|
+
slicer = FakeSlicer.new 'toast'.bytes
|
25
|
+
field = TextField.new 'dummy', 24
|
26
|
+
assert_equal 'tsaot', field.read( slicer )
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_write
|
30
|
+
slicer = FakeSlicer.new
|
31
|
+
field = TextField.new 'dummy', 24
|
32
|
+
field.write slicer, 'toast'
|
33
|
+
assert_equal 'tsaot', slicer.get_bytes.stringify
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
class FakeSlicer
|
41
|
+
|
42
|
+
def initialize( data = '' )
|
43
|
+
@data = data
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_bytes
|
47
|
+
@data
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_bytes( data )
|
51
|
+
@data = data
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
require 'bit_struct/struct_base'
|
5
|
+
|
6
|
+
include BitStruct
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
class TestTextStruct < Test::Unit::TestCase
|
11
|
+
|
12
|
+
class AlignedText < StructBase
|
13
|
+
unsigned :before, 8
|
14
|
+
text :aligned, 32
|
15
|
+
unsigned :after, 8
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_aligned_text
|
19
|
+
data = [ 0x12, ?t, ?s, ?e, ?t, 0x34 ].pack( 'C*' )
|
20
|
+
struct = AlignedText.new data
|
21
|
+
assert_equal 0x34, struct.before
|
22
|
+
assert_equal 'test', struct.aligned
|
23
|
+
assert_equal 0x12, struct.after
|
24
|
+
|
25
|
+
struct.before = ?A
|
26
|
+
struct.aligned = 'goal'
|
27
|
+
struct.after = ?B
|
28
|
+
assert_equal ?A, struct.before
|
29
|
+
assert_equal 'goal', struct.aligned
|
30
|
+
assert_equal ?B, struct.after
|
31
|
+
|
32
|
+
assert_equal 'BlaogA', struct.data
|
33
|
+
end
|
34
|
+
|
35
|
+
class UnalignedText < StructBase
|
36
|
+
unsigned :before, 4
|
37
|
+
text :unaligned, 24
|
38
|
+
unsigned :after, 4
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_unaligned_text
|
42
|
+
a_hi, a_lo = get_hi_lo ?a
|
43
|
+
b_hi, b_lo = get_hi_lo ?b
|
44
|
+
c_hi, c_lo = get_hi_lo ?c
|
45
|
+
|
46
|
+
data = [ 12 << 4 | c_hi, c_lo << 4 | b_hi, b_lo << 4 | a_hi, a_lo << 4 | 3 ].pack( 'C*' )
|
47
|
+
|
48
|
+
struct = UnalignedText.new data
|
49
|
+
assert_equal 3, struct.before
|
50
|
+
assert_equal 'abc', struct.unaligned
|
51
|
+
assert_equal 12, struct.after
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_hi_lo( char )
|
55
|
+
return char >> 4, char & 0x0F
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/test/ruby/runner.rb
CHANGED
@@ -5,6 +5,12 @@ require 'test/unit/autorunner'
|
|
5
5
|
|
6
6
|
class String
|
7
7
|
|
8
|
+
def bytes
|
9
|
+
bytes = []
|
10
|
+
self.each_byte { |b| bytes << b }
|
11
|
+
bytes
|
12
|
+
end
|
13
|
+
|
8
14
|
def hexify
|
9
15
|
result = ''
|
10
16
|
each_byte do |b|
|
@@ -17,6 +23,12 @@ end
|
|
17
23
|
|
18
24
|
class Array
|
19
25
|
|
26
|
+
def stringify
|
27
|
+
res = ''
|
28
|
+
self.each { |b| res << b }
|
29
|
+
res
|
30
|
+
end
|
31
|
+
|
20
32
|
def hexify
|
21
33
|
map { |b| "0x#{b && b.hexify}" }.join( ' ' )
|
22
34
|
end
|
metadata
CHANGED
@@ -3,7 +3,7 @@ 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.
|
6
|
+
version: 0.0.64
|
7
7
|
date: 2006-04-13 00:00:00 +02:00
|
8
8
|
summary: Simple DSL for defining bit-based structures on byte data.
|
9
9
|
require_paths:
|
@@ -33,10 +33,13 @@ files:
|
|
33
33
|
- src/ruby/bit_struct/field.rb
|
34
34
|
- src/ruby/bit_struct/nested.rb
|
35
35
|
- src/ruby/bit_struct/struct_base.rb
|
36
|
+
- src/ruby/bit_struct/text.rb
|
36
37
|
- src/ruby/bit_struct/unsigned.rb
|
37
38
|
- test/ruby/runner.rb
|
38
39
|
- test/ruby/bit_struct/test_bit_slicer.rb
|
39
40
|
- test/ruby/bit_struct/test_struct_base.rb
|
41
|
+
- test/ruby/bit_struct/test_text.rb
|
42
|
+
- test/ruby/bit_struct/test_text_struct.rb
|
40
43
|
- Rakefile
|
41
44
|
- Version
|
42
45
|
test_files: []
|