BitStructEx 0.0.86 → 0.0.91
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/src/bit_struct/bit_slicer.rb +13 -15
- data/src/bit_struct/byte_data.rb +4 -51
- data/src/bit_struct/struct_base.rb +1 -6
- metadata +2 -2
@@ -72,36 +72,32 @@ module BitStruct
|
|
72
72
|
|
73
73
|
#private
|
74
74
|
|
75
|
-
def get_data( idx )
|
76
|
-
@data[ idx ]
|
77
|
-
end
|
78
|
-
|
79
75
|
def set_data( idx, val )
|
80
76
|
@data[ idx ] = val
|
81
77
|
end
|
82
78
|
|
83
79
|
def first_byte
|
84
|
-
data.length - ( ( @bit_offset + @bit_length ) / 8.0 ).ceil
|
80
|
+
@first_byte ||= ( data.length - ( ( @bit_offset + @bit_length ) / 8.0 ).ceil )
|
85
81
|
end
|
86
82
|
|
87
83
|
def last_byte
|
88
|
-
data.length - 1 - @bit_offset / 8
|
84
|
+
@last_byte ||= ( data.length - 1 - @bit_offset / 8 )
|
89
85
|
end
|
90
86
|
|
91
87
|
def length_in_bytes
|
92
|
-
( @bit_length / 8.0 ).ceil
|
88
|
+
@length_in_bytes ||= ( @bit_length / 8.0 ).ceil
|
93
89
|
end
|
94
90
|
|
95
91
|
def insert_length_in_bytes
|
96
|
-
( ( ( @bit_offset & 7 ) + @bit_length ) / 8.0 ).ceil
|
92
|
+
@insert_length_in_bytes ||= ( ( ( @bit_offset & 7 ) + @bit_length ) / 8.0 ).ceil
|
97
93
|
end
|
98
94
|
|
99
95
|
def masked_first_byte
|
100
|
-
|
96
|
+
@data[ first_byte ] & merge_first_byte_mask
|
101
97
|
end
|
102
98
|
|
103
99
|
def masked_last_byte
|
104
|
-
|
100
|
+
@data[ last_byte ] & merge_last_byte_mask
|
105
101
|
end
|
106
102
|
|
107
103
|
def required_shift
|
@@ -111,7 +107,7 @@ module BitStruct
|
|
111
107
|
def get_raw_bytes
|
112
108
|
raw_bytes = []
|
113
109
|
first_byte.upto( last_byte ) do |idx|
|
114
|
-
raw_bytes <<
|
110
|
+
raw_bytes << @data[ idx ]
|
115
111
|
end
|
116
112
|
raw_bytes
|
117
113
|
end
|
@@ -123,20 +119,22 @@ module BitStruct
|
|
123
119
|
end
|
124
120
|
|
125
121
|
def highest_byte_mask
|
122
|
+
return @highest_byte_mask if @highest_byte_mask
|
126
123
|
mask_bits = ( ( @bit_length ) & 7 )
|
127
124
|
mask_bits = 8 if mask_bits == 0
|
128
|
-
( 2 ** mask_bits ) - 1
|
125
|
+
@highest_byte_mask = ( 2 ** mask_bits ) - 1
|
129
126
|
end
|
130
127
|
|
131
128
|
def insert_first_byte_mask
|
129
|
+
return @insert_first_byte_mask if @insert_first_byte_mask
|
132
130
|
mask_bits = ( ( @bit_offset + @bit_length ) & 7 )
|
133
131
|
mask_bits = 8 if mask_bits == 0
|
134
|
-
( 2 ** mask_bits ) - 1
|
132
|
+
@insert_first_byte_mask = ( 2 ** mask_bits ) - 1
|
135
133
|
end
|
136
134
|
|
137
135
|
def insert_last_byte_mask
|
138
|
-
|
139
|
-
( mask_bits << ( @bit_offset & 7 ) ) & 0xFF
|
136
|
+
return @insert_last_byte_mask if @insert_last_byte_mask
|
137
|
+
@insert_last_byte_mask = ( ( mask_bits = 0xFF ) << ( @bit_offset & 7 ) ) & 0xFF
|
140
138
|
end
|
141
139
|
|
142
140
|
def merge_first_byte_mask
|
data/src/bit_struct/byte_data.rb
CHANGED
@@ -7,64 +7,17 @@ module BitStruct
|
|
7
7
|
|
8
8
|
include Endianess
|
9
9
|
|
10
|
-
def
|
10
|
+
def self.endianize( data, endianess = nil )
|
11
11
|
raise "Bad input" unless data.respond_to? "[]".to_sym
|
12
12
|
raise "Unknown endianess" unless valid endianess
|
13
|
-
|
14
|
-
|
13
|
+
data = data.reverse if ( endianess || BIG_ENDIAN ) == LITTLE_ENDIAN
|
14
|
+
data
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
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
|
-
def reverse
|
44
|
-
ReversedByteData.new self, BIG_ENDIAN
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def valid( endianess )
|
17
|
+
def self.valid( endianess )
|
50
18
|
endianess == nil || endianess == LITTLE_ENDIAN || endianess == BIG_ENDIAN
|
51
19
|
end
|
52
20
|
|
53
|
-
def endianized( idx )
|
54
|
-
return idx if @endianess == BIG_ENDIAN
|
55
|
-
return @data.length - idx - 1 if @endianess == LITTLE_ENDIAN
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
class ReversedByteData < ByteData
|
61
|
-
|
62
|
-
alias super_endianized endianized
|
63
|
-
|
64
|
-
def endianized( idx )
|
65
|
-
res = super_endianized( idx )
|
66
|
-
@data.length - res - 1
|
67
|
-
end
|
68
21
|
end
|
69
22
|
|
70
23
|
end
|
@@ -59,12 +59,7 @@ module BitStruct
|
|
59
59
|
|
60
60
|
def set_data( new_data, endianess = nil )
|
61
61
|
raise "No data?" unless new_data
|
62
|
-
|
63
|
-
raise "Cannot change endianess of ByteData object" if endianess
|
64
|
-
@data = new_data
|
65
|
-
else new_data
|
66
|
-
@data = ByteData.new new_data, endianess
|
67
|
-
end
|
62
|
+
@data = ByteData.endianize new_data, endianess
|
68
63
|
end
|
69
64
|
|
70
65
|
def to_s( delimiter = "\n" )
|
metadata
CHANGED
@@ -3,8 +3,8 @@ 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.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.0.91
|
7
|
+
date: 2006-06-04 00:00:00 +02:00
|
8
8
|
summary: Simple DSL for defining bit-based structures on byte data.
|
9
9
|
require_paths:
|
10
10
|
- src
|