sanderjd-bitch 0.0.1
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/README +0 -0
- data/bitch.gemspec +16 -0
- data/demo.rb +21 -0
- data/lib/bitch.rb +54 -0
- data/lib/bits.rb +57 -0
- metadata +57 -0
data/README
ADDED
File without changes
|
data/bitch.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "bitch"
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.date = "2009-01-02"
|
5
|
+
s.authors = ["James Sanders"]
|
6
|
+
s.email = "sanderjd@gmail.com"
|
7
|
+
s.summary = "Bitch provides simple composition of bit fields"
|
8
|
+
s.homepage = "http://github.com/sanderjd/bitch"
|
9
|
+
s.description = "Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields"
|
10
|
+
s.has_rdoc = true
|
11
|
+
s.files = ["README",
|
12
|
+
"bitch.gemspec",
|
13
|
+
"demo.rb",
|
14
|
+
"lib/bits.rb",
|
15
|
+
"lib/bitch.rb"]
|
16
|
+
end
|
data/demo.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/lib/bitch'
|
2
|
+
|
3
|
+
message = Bitch.compose do |m|
|
4
|
+
m.bits :beginning, :length => 10, :value => 0b1010101010
|
5
|
+
m.bits :middle, :length => 5
|
6
|
+
m.bits :end, :length => 10, :value => 1
|
7
|
+
end
|
8
|
+
|
9
|
+
# 1010101010000000000000001
|
10
|
+
puts message.get_bits.bit_string
|
11
|
+
|
12
|
+
message[:middle] = 31
|
13
|
+
|
14
|
+
# 1010101010111110000000001
|
15
|
+
puts message.get_bits.bit_string
|
16
|
+
# 1557c01
|
17
|
+
puts message.get_bits.hex_string
|
18
|
+
# 125276001
|
19
|
+
puts message.get_bits.oct_string
|
20
|
+
# 22379521
|
21
|
+
puts message.get_bits.integer
|
data/lib/bitch.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/bits'
|
2
|
+
|
3
|
+
class Bitch
|
4
|
+
def self.fields(name, &block)
|
5
|
+
formats[name] = self.new
|
6
|
+
yield formats[name]
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.compose(&block)
|
10
|
+
composition = self.new
|
11
|
+
yield composition
|
12
|
+
composition
|
13
|
+
end
|
14
|
+
|
15
|
+
def bring(name, params = {})
|
16
|
+
format = Bitch.formats[name]
|
17
|
+
params.each_pair { |field, value| format[field] = value }
|
18
|
+
field_array << { name => format.get_bits }
|
19
|
+
end
|
20
|
+
|
21
|
+
def bits(name, params)
|
22
|
+
value = params.key?(:value) ? params[:value] : 0
|
23
|
+
length = params.key?(:length) ? params[:length] : 0
|
24
|
+
field_array << { name => Bits.new(value, length) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_bits
|
28
|
+
field_array.inject(nil) do |fields, field|
|
29
|
+
bits = field.values.first
|
30
|
+
fields ? fields + bits : bits
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](name)
|
35
|
+
field_array.select { |field| field.key?(name) }.first.values.first
|
36
|
+
end
|
37
|
+
|
38
|
+
def []=(name, value)
|
39
|
+
element_array = field_array.select { |field| field.key?(name) }
|
40
|
+
element = element_array.first.values.first unless element_array.empty?
|
41
|
+
element.set(value) unless element.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def field_array
|
47
|
+
@field_array ||= Array.new
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.formats
|
51
|
+
@@formats ||= Hash.new
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
data/lib/bits.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Bits provides an easy way to store and access sequences of bits,
|
2
|
+
# allowing input and output in multiple formats
|
3
|
+
|
4
|
+
class Bits
|
5
|
+
|
6
|
+
# +bits+:: The bit field to store
|
7
|
+
# +length+:: Length of the bit field - default to calculated length, 0-pad on
|
8
|
+
# MSB
|
9
|
+
|
10
|
+
def initialize(bits, length = 0)
|
11
|
+
@length = length
|
12
|
+
@bits = bit_string_from_input(bits, length)
|
13
|
+
end
|
14
|
+
|
15
|
+
def +(bits)
|
16
|
+
Bits.new("0b#{@bits}" + bit_string_from_input(bits))
|
17
|
+
end
|
18
|
+
|
19
|
+
def bit_string
|
20
|
+
@bits
|
21
|
+
end
|
22
|
+
|
23
|
+
def hex_string
|
24
|
+
@bits.to_i(2).to_s(16)
|
25
|
+
end
|
26
|
+
|
27
|
+
def oct_string
|
28
|
+
@bits.to_i(2).to_s(8)
|
29
|
+
end
|
30
|
+
|
31
|
+
def integer
|
32
|
+
@bits.to_i(2)
|
33
|
+
end
|
34
|
+
|
35
|
+
def set(bits)
|
36
|
+
@bits = bit_string_from_input(bits, @length)
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
attr_reader :bits
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def bit_string_from_input(bits, length = 0)
|
46
|
+
case bits
|
47
|
+
when Integer, Fixnum, Bignum
|
48
|
+
"%0#{length}b" % bits
|
49
|
+
when String
|
50
|
+
"%0#{length}b" % Integer(bits)
|
51
|
+
when Bits
|
52
|
+
bits.bits
|
53
|
+
else
|
54
|
+
raise TypeError, "Unsupported data type #{bits.class}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sanderjd-bitch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Sanders
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-02 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields
|
17
|
+
email: sanderjd@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- README
|
26
|
+
- bitch.gemspec
|
27
|
+
- demo.rb
|
28
|
+
- lib/bits.rb
|
29
|
+
- lib/bitch.rb
|
30
|
+
has_rdoc: true
|
31
|
+
homepage: http://github.com/sanderjd/bitch
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "0"
|
42
|
+
version:
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
requirements: []
|
50
|
+
|
51
|
+
rubyforge_project:
|
52
|
+
rubygems_version: 1.2.0
|
53
|
+
signing_key:
|
54
|
+
specification_version: 2
|
55
|
+
summary: Bitch provides simple composition of bit fields
|
56
|
+
test_files: []
|
57
|
+
|