bin_tools 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/bin_tools.rb +3 -0
- data/lib/bin_tools/reader.rb +151 -0
- data/lib/bin_tools/writer.rb +123 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: afa83c1999ac186ee2e917d137c27a3926cf69bf
|
4
|
+
data.tar.gz: 4b59fc2d1afd8f42ff96b9a2814ca0ef04fb866a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 59df6d09f30b27b08e64828e16e8d2ce1e53c45483eb010b1b8c69630c3fc184d26a9ebabcae1133a0a502a8b5e1ed14f436985980daa8dfd0ad1277fdbe2a6f
|
7
|
+
data.tar.gz: fbf60d1eb431b742a537d6c49b8d0fca83b01911b69e028596e0cb1a883aa9edfd1dda44b364989770bff906c958804cf95bee296d4b7ef84998ca67cf1b8d4d
|
data/lib/bin_tools.rb
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
# General purpose binary reader
|
2
|
+
|
3
|
+
# 8 16 32 64
|
4
|
+
# C S L Q - unsigned
|
5
|
+
# c s l q - unsigned
|
6
|
+
# < LE
|
7
|
+
# > BE
|
8
|
+
# A - binary string
|
9
|
+
# z - null terminated
|
10
|
+
# H - hex string
|
11
|
+
|
12
|
+
class BinTools::Reader
|
13
|
+
def initialize str
|
14
|
+
@rom = str
|
15
|
+
@cur = 0
|
16
|
+
@base = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_file fn
|
20
|
+
data = File.open(fn, "rb") { |io| io.read }
|
21
|
+
self.new data
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_base pos
|
25
|
+
@base = pos
|
26
|
+
end
|
27
|
+
|
28
|
+
def seek pos
|
29
|
+
@cur = pos + @base
|
30
|
+
end
|
31
|
+
|
32
|
+
def seek_rel pos
|
33
|
+
@cur += pos
|
34
|
+
end
|
35
|
+
|
36
|
+
def tell
|
37
|
+
@cur - @base
|
38
|
+
end
|
39
|
+
|
40
|
+
def read_str len
|
41
|
+
r = @rom[@cur..(@cur + len - 1)].unpack("A#{len}").first
|
42
|
+
@cur += len
|
43
|
+
r
|
44
|
+
end
|
45
|
+
|
46
|
+
def read_str_varlen
|
47
|
+
len = read_varlen_le
|
48
|
+
r = @rom[@cur..(@cur + len - 1)].unpack("A#{len}").first
|
49
|
+
@cur += len
|
50
|
+
r
|
51
|
+
end
|
52
|
+
|
53
|
+
def read_byte
|
54
|
+
r = @rom[@cur].ord
|
55
|
+
@cur += 1
|
56
|
+
r
|
57
|
+
end
|
58
|
+
|
59
|
+
def read_bool
|
60
|
+
read_byte == 1
|
61
|
+
end
|
62
|
+
|
63
|
+
def read_s8
|
64
|
+
r = @rom[@cur].unpack("c").first
|
65
|
+
@cur += 1
|
66
|
+
r
|
67
|
+
end
|
68
|
+
|
69
|
+
def read_u16_le
|
70
|
+
r = @rom[@cur..(@cur + 3)].unpack('S<').first
|
71
|
+
@cur += 2
|
72
|
+
r
|
73
|
+
end
|
74
|
+
|
75
|
+
def read_s16_le
|
76
|
+
r = @rom[@cur..(@cur + 3)].unpack('s<').first
|
77
|
+
@cur += 2
|
78
|
+
r
|
79
|
+
end
|
80
|
+
|
81
|
+
def read_u16_be
|
82
|
+
r = @rom[@cur..(@cur + 3)].unpack('S>').first
|
83
|
+
@cur += 2
|
84
|
+
r
|
85
|
+
end
|
86
|
+
|
87
|
+
def read_u32_le
|
88
|
+
r = @rom[@cur..(@cur + 3)].unpack('L<').first
|
89
|
+
@cur += 4
|
90
|
+
r
|
91
|
+
end
|
92
|
+
|
93
|
+
def read_s32_le
|
94
|
+
r = @rom[@cur..(@cur + 3)].unpack('l<').first
|
95
|
+
@cur += 4
|
96
|
+
r
|
97
|
+
end
|
98
|
+
|
99
|
+
def read_u32_be
|
100
|
+
r = @rom[@cur..(@cur + 3)].unpack('L>').first
|
101
|
+
@cur += 4
|
102
|
+
r
|
103
|
+
end
|
104
|
+
|
105
|
+
def read_f32_le
|
106
|
+
r = @rom[@cur..(@cur + 3)].unpack('e').first
|
107
|
+
@cur += 4
|
108
|
+
r
|
109
|
+
end
|
110
|
+
|
111
|
+
def read_bin len
|
112
|
+
r = @rom[@cur..(@cur + len - 1)]
|
113
|
+
@cur += len
|
114
|
+
r
|
115
|
+
end
|
116
|
+
|
117
|
+
def read_binswap len
|
118
|
+
togo = len
|
119
|
+
bin_data = "".b
|
120
|
+
while togo > 0
|
121
|
+
r = @rom[@cur..(@cur + 3)].unpack('L>')
|
122
|
+
bin_data += r.pack('L<')
|
123
|
+
@cur += 4
|
124
|
+
togo -= 4
|
125
|
+
end
|
126
|
+
bin_data
|
127
|
+
end
|
128
|
+
|
129
|
+
def read_varlen_le
|
130
|
+
val = 0
|
131
|
+
r = read_byte
|
132
|
+
val = r & 0x7F
|
133
|
+
return val if r < 0x80
|
134
|
+
r = read_byte << 7
|
135
|
+
val + r
|
136
|
+
end
|
137
|
+
|
138
|
+
def read_varlen_be
|
139
|
+
val = 0
|
140
|
+
r = read_byte
|
141
|
+
val = r & 0x7F
|
142
|
+
return val if r < 0x80
|
143
|
+
r = read_byte
|
144
|
+
val = (val << 8) + r
|
145
|
+
val
|
146
|
+
end
|
147
|
+
|
148
|
+
def msg str
|
149
|
+
puts "%08X(%08X): %s" % [@cur, tell, str]
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# 8 16 32 64
|
2
|
+
# C S L Q - unsigned
|
3
|
+
# c s l q - unsigned
|
4
|
+
# < LE
|
5
|
+
# > BE
|
6
|
+
# A - binary string
|
7
|
+
# z - null terminated
|
8
|
+
# H - hex string
|
9
|
+
|
10
|
+
|
11
|
+
class BinTools::Writer
|
12
|
+
def initialize fn
|
13
|
+
@f = File.new fn, "wb"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.open fn, &block
|
17
|
+
f = self.new fn
|
18
|
+
block.call f
|
19
|
+
f.close
|
20
|
+
end
|
21
|
+
|
22
|
+
def seek pos
|
23
|
+
@f.seek pos
|
24
|
+
end
|
25
|
+
|
26
|
+
def tell
|
27
|
+
@f.tell
|
28
|
+
end
|
29
|
+
|
30
|
+
def write_str str
|
31
|
+
@f.write str
|
32
|
+
end
|
33
|
+
|
34
|
+
def write_str_varlen str
|
35
|
+
write_varlen_le str.size
|
36
|
+
@f.write str
|
37
|
+
end
|
38
|
+
|
39
|
+
def write_byte val
|
40
|
+
@f.write [val].pack("C")
|
41
|
+
end
|
42
|
+
|
43
|
+
def write_bool val
|
44
|
+
write_byte val ? 1 : 0
|
45
|
+
end
|
46
|
+
|
47
|
+
def write_u16_le val
|
48
|
+
@f.write [val].pack("S<")
|
49
|
+
end
|
50
|
+
|
51
|
+
def write_s16_le val
|
52
|
+
@f.write [val].pack("s<")
|
53
|
+
end
|
54
|
+
|
55
|
+
def write_u16_be val
|
56
|
+
@f.write [val].pack("S>")
|
57
|
+
end
|
58
|
+
|
59
|
+
def write_u32_le val
|
60
|
+
@f.write [val].pack("L<")
|
61
|
+
end
|
62
|
+
|
63
|
+
def write_s32_le val
|
64
|
+
@f.write [val].pack("l<")
|
65
|
+
end
|
66
|
+
|
67
|
+
def write_u32_be val
|
68
|
+
@f.write [val].pack("L>")
|
69
|
+
end
|
70
|
+
|
71
|
+
def write_f32_le val
|
72
|
+
@f.write [val].pack("e")
|
73
|
+
end
|
74
|
+
|
75
|
+
def write_u24_be val
|
76
|
+
write_byte val >> 16
|
77
|
+
write_u16_be val & 0xFFFF
|
78
|
+
end
|
79
|
+
|
80
|
+
def write_bin str
|
81
|
+
@f.write str
|
82
|
+
end
|
83
|
+
|
84
|
+
def write_varlen_be val
|
85
|
+
out = [val & 0x7F]
|
86
|
+
val = val >> 7
|
87
|
+
while val > 0
|
88
|
+
out << (val & 0x7f) + 0x80
|
89
|
+
val = val >> 7
|
90
|
+
end
|
91
|
+
out.reverse.each do |x|
|
92
|
+
write_byte x
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def write_varlen_le val
|
97
|
+
out = [val & 0x7F]
|
98
|
+
val = val >> 7
|
99
|
+
while val > 0
|
100
|
+
out << (val & 0x7f)
|
101
|
+
val = val >> 7
|
102
|
+
end
|
103
|
+
out.each_with_index do |x, i|
|
104
|
+
write_byte(x + ((i == out.size - 1) ? 0 : 0x80))
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def write_binswap str
|
109
|
+
togo = str.size
|
110
|
+
pos = 0
|
111
|
+
while togo > 0
|
112
|
+
r = @rom[pos..(pos+3)].unpack('L>')
|
113
|
+
d = r.pack('L<')
|
114
|
+
write_bin d
|
115
|
+
pos += 4
|
116
|
+
togo -= 4
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def close
|
121
|
+
@f.close
|
122
|
+
end
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bin_tools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Madeline Lim
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Binary I/O library for Ruby that is similar to using the C# Binary Reader
|
14
|
+
and Writer.
|
15
|
+
email: deltabouche@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/bin_tools.rb
|
21
|
+
- lib/bin_tools/reader.rb
|
22
|
+
- lib/bin_tools/writer.rb
|
23
|
+
homepage: https://github.com/deltabouche/bin_tools
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.6.14
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: Binary I/O library for Ruby
|
47
|
+
test_files: []
|