leb128 0.1.1 → 1.0.0
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.
- checksums.yaml +4 -4
- data/README.md +6 -6
- data/leb128.gemspec +16 -16
- data/lib/leb128.rb +59 -19
- data/test/test_leb128.rb +8 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf3a19c67617bdb7e0195e364134def4c55f1bd0
|
4
|
+
data.tar.gz: 77ae39dca195965e95a4efc0a437f27c11afcf14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a95c66b3d490f333055219fa1a2177d73faf63b33f047edc6fc2971857fcf657534bd6837dbb40b638430a658b51dff386420312e641e3f79c0fc5080ddd6bab
|
7
|
+
data.tar.gz: ab733a9ddec874581862857d3b8b5d95495716046264d6b63917d38abc0137765e723071cc8b65ad164b2f6da6f04400fb9bc5bf51fef002a9d2f5c959492bc9
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://raw.githubusercontent.com/cl8n/leb128/master/LICENSE.md) [](https://travis-ci.org/cl8n/leb128) [](http://www.rubydoc.info/gems/leb128)
|
4
4
|
|
5
|
-
This gem is a
|
5
|
+
This gem is a set of utility functions for encoding and decoding LEB128-compressed integers.
|
6
6
|
|
7
7
|
As a visual example, this is an excerpt from the [LEB128 Wikipedia page](https://en.wikipedia.org/wiki/LEB128) describing how an integer is encoded into an unsigned LEB128:
|
8
8
|
|
@@ -41,20 +41,20 @@ require 'leb128'
|
|
41
41
|
|
42
42
|
### Encoding and Decoding
|
43
43
|
|
44
|
-
Encode integers into LEB128-compressed data by using the `
|
44
|
+
Encode integers into LEB128-compressed data by using the `encode_unsigned` and `encode_signed` methods. The functions take one argument, being the integer to encode. The following encodes the given integer and returns a new StringIO containing it:
|
45
45
|
|
46
46
|
```ruby
|
47
|
-
LEB128.
|
48
|
-
#=> #<StringIO:
|
47
|
+
LEB128.encode_signed(-0x143f)
|
48
|
+
#=> #<StringIO:0x00000000000000>
|
49
49
|
```
|
50
50
|
|
51
|
-
Decode LEB128-compressed data into integers by using the `
|
51
|
+
Decode LEB128-compressed data into integers by using the `decode_unsigned` and `decode_signed` methods. The functions take two arguments: a StringIO containing the LEB128-compressed data, and an optional integer that sets the position of the StringIO (default is 0). The following decodes the given StringIO and returns a new integer containing it:
|
52
52
|
|
53
53
|
```ruby
|
54
54
|
sio = StringIO.new
|
55
55
|
sio.putc(0xc1)
|
56
56
|
sio.putc(0x57)
|
57
|
-
LEB128.
|
57
|
+
LEB128.decode_unsigned(sio)
|
58
58
|
#=> 11201
|
59
59
|
```
|
60
60
|
|
data/leb128.gemspec
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
Gem::Specification.new do |spec|
|
2
|
-
spec.name = "leb128"
|
3
|
-
spec.version = "0.
|
4
|
-
spec.authors = ["Clayton Bonigut"]
|
5
|
-
|
6
|
-
spec.summary = %q{A
|
7
|
-
spec.homepage = "https://github.com/cl8n/leb128"
|
8
|
-
spec.license = "MIT"
|
9
|
-
|
10
|
-
spec.files = `git ls-files -z`.split("\x0")
|
11
|
-
|
12
|
-
spec.add_development_dependency "bundler", "~> 1.12"
|
13
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
14
|
-
spec.add_development_dependency "minitest", "~> 5.0"
|
15
|
-
spec.add_development_dependency "yard"
|
16
|
-
end
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "leb128"
|
3
|
+
spec.version = "1.0.0"
|
4
|
+
spec.authors = ["Clayton Bonigut"]
|
5
|
+
|
6
|
+
spec.summary = %q{A set of utility functions for encoding and decoding LEB128-compressed integers.}
|
7
|
+
spec.homepage = "https://github.com/cl8n/leb128"
|
8
|
+
spec.license = "MIT"
|
9
|
+
|
10
|
+
spec.files = `git ls-files -z`.split("\x0")
|
11
|
+
|
12
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
13
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
14
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
15
|
+
spec.add_development_dependency "yard"
|
16
|
+
end
|
data/lib/leb128.rb
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
|
3
|
-
# Includes a
|
3
|
+
# Includes a set of functions to encode and decode the LEB128 integer compression type.
|
4
4
|
module LEB128
|
5
|
-
# Encode an integer into LEB128-compressed data.
|
5
|
+
# Encode an unsigned integer into LEB128-compressed data.
|
6
6
|
#
|
7
7
|
# @param value [Integer]
|
8
|
-
# @param signed [Boolean]
|
9
8
|
# @return [StringIO]
|
10
9
|
#
|
11
10
|
# @example
|
12
|
-
# LEB128.
|
11
|
+
# LEB128.encode_unsigned(0x2bc1) #=> #<StringIO:0x00000000000000>
|
13
12
|
|
14
|
-
def self.
|
15
|
-
if value < 0
|
13
|
+
def self.encode_unsigned(value)
|
14
|
+
if value < 0
|
16
15
|
raise(ArgumentError,
|
17
16
|
'Cannot encode a negative integer to an unsigned LEB128')
|
18
17
|
end
|
@@ -20,24 +19,65 @@ module LEB128
|
|
20
19
|
loop do
|
21
20
|
byte = value & 0x7F
|
22
21
|
value >>= 7
|
23
|
-
if
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
byte |= 0x80 if value != 0
|
23
|
+
io.putc(byte)
|
24
|
+
break if value == 0
|
25
|
+
end
|
26
|
+
io.pos = 0
|
27
|
+
io
|
28
|
+
end
|
29
|
+
|
30
|
+
# Encode a signed integer into LEB128-compressed data.
|
31
|
+
#
|
32
|
+
# @param value [Integer]
|
33
|
+
# @return [StringIO]
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# LEB128.encode_signed(-0x143f) #=> #<StringIO:0x00000000000000>
|
37
|
+
|
38
|
+
def self.encode_signed(value)
|
39
|
+
io = StringIO.new
|
40
|
+
loop do
|
41
|
+
byte = value & 0x7F
|
42
|
+
value >>= 7
|
43
|
+
byte |= 0x80 unless (value == 0 && byte & 0x40 == 0) ||
|
44
|
+
(value == -1 && byte & 0x40 != 0)
|
29
45
|
io.putc(byte)
|
30
|
-
break if
|
31
|
-
(!signed && value == 0)
|
46
|
+
break if byte & 0x80 == 0
|
32
47
|
end
|
33
48
|
io.pos = 0
|
34
49
|
io
|
35
50
|
end
|
36
51
|
|
37
|
-
# Decode LEB128-compressed data into an integer.
|
52
|
+
# Decode unsigned LEB128-compressed data into an integer.
|
53
|
+
#
|
54
|
+
# @param io [StringIO]
|
55
|
+
# @param index [Integer]
|
56
|
+
# @return [Integer]
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# sio = StringIO.new
|
60
|
+
# sio.putc(0xc1)
|
61
|
+
# sio.putc(0x57)
|
62
|
+
# LEB128.decode_unsigned(sio) #=> 11201
|
63
|
+
|
64
|
+
def self.decode_unsigned(io, index = 0)
|
65
|
+
io.pos = index
|
66
|
+
raise(EOFError) if io.eof?
|
67
|
+
value = 0
|
68
|
+
offset = 0
|
69
|
+
loop do
|
70
|
+
byte = io.read(1).unpack('C')[0]
|
71
|
+
value |= (byte & 0x7F) << offset
|
72
|
+
break if byte & 0x80 == 0
|
73
|
+
offset += 7
|
74
|
+
end
|
75
|
+
value
|
76
|
+
end
|
77
|
+
|
78
|
+
# Decode signed LEB128-compressed data into an integer.
|
38
79
|
#
|
39
80
|
# @param io [StringIO]
|
40
|
-
# @param signed [Boolean]
|
41
81
|
# @param index [Integer]
|
42
82
|
# @return [Integer]
|
43
83
|
#
|
@@ -45,9 +85,9 @@ module LEB128
|
|
45
85
|
# sio = StringIO.new
|
46
86
|
# sio.putc(0xc1)
|
47
87
|
# sio.putc(0x57)
|
48
|
-
# LEB128.
|
88
|
+
# LEB128.decode_signed(sio) #=> -5183
|
49
89
|
|
50
|
-
def self.
|
90
|
+
def self.decode_signed(io, index = 0)
|
51
91
|
io.pos = index
|
52
92
|
raise(EOFError) if io.eof?
|
53
93
|
value = 0
|
@@ -57,7 +97,7 @@ module LEB128
|
|
57
97
|
value |= (byte & 0x7F) << offset
|
58
98
|
offset += 7
|
59
99
|
if byte & 0x80 == 0
|
60
|
-
value |= -(1 << offset)
|
100
|
+
value |= -(1 << offset) unless byte & 0x40 == 0
|
61
101
|
break
|
62
102
|
end
|
63
103
|
end
|
data/test/test_leb128.rb
CHANGED
@@ -6,7 +6,7 @@ class LEB128Test < Minitest::Test
|
|
6
6
|
buffer = StringIO.new
|
7
7
|
buffer.putc(0xc1)
|
8
8
|
buffer.putc(0x57)
|
9
|
-
actual = LEB128.
|
9
|
+
actual = LEB128.decode_signed(buffer)
|
10
10
|
expected = -0x143f
|
11
11
|
assert_equal(expected, actual)
|
12
12
|
end
|
@@ -15,7 +15,7 @@ class LEB128Test < Minitest::Test
|
|
15
15
|
buffer = StringIO.new
|
16
16
|
buffer.putc(0x8e)
|
17
17
|
buffer.putc(0x32)
|
18
|
-
actual = LEB128.
|
18
|
+
actual = LEB128.decode_signed(buffer)
|
19
19
|
expected = 0x190e
|
20
20
|
assert_equal(expected, actual)
|
21
21
|
end
|
@@ -24,7 +24,7 @@ class LEB128Test < Minitest::Test
|
|
24
24
|
buffer = StringIO.new
|
25
25
|
buffer.putc(0xc1)
|
26
26
|
buffer.putc(0x57)
|
27
|
-
actual = LEB128.
|
27
|
+
actual = LEB128.decode_unsigned(buffer)
|
28
28
|
expected = 0x2bc1
|
29
29
|
assert_equal(expected, actual)
|
30
30
|
end
|
@@ -33,7 +33,7 @@ class LEB128Test < Minitest::Test
|
|
33
33
|
assert_raises(EOFError) do
|
34
34
|
buffer = StringIO.new
|
35
35
|
buffer.putc(0x01)
|
36
|
-
LEB128.
|
36
|
+
LEB128.decode_unsigned(buffer, 1)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -41,7 +41,7 @@ class LEB128Test < Minitest::Test
|
|
41
41
|
buffer = StringIO.new
|
42
42
|
buffer.putc(0xc1)
|
43
43
|
buffer.putc(0x57)
|
44
|
-
actual = LEB128.
|
44
|
+
actual = LEB128.encode_signed(-0x143f).string
|
45
45
|
expected = buffer.string
|
46
46
|
assert_equal(expected, actual)
|
47
47
|
end
|
@@ -50,14 +50,14 @@ class LEB128Test < Minitest::Test
|
|
50
50
|
buffer = StringIO.new
|
51
51
|
buffer.putc(0x8e)
|
52
52
|
buffer.putc(0x32)
|
53
|
-
actual = LEB128.
|
53
|
+
actual = LEB128.encode_signed(0x190e).string
|
54
54
|
expected = buffer.string
|
55
55
|
assert_equal(expected, actual)
|
56
56
|
end
|
57
57
|
|
58
58
|
def test_encode_unsigned_negative_int_argumenterror
|
59
59
|
exception = assert_raises(ArgumentError) do
|
60
|
-
LEB128.
|
60
|
+
LEB128.encode_unsigned(-0x01)
|
61
61
|
end
|
62
62
|
assert_equal('Cannot encode a negative integer to an unsigned LEB128', exception.message)
|
63
63
|
end
|
@@ -66,7 +66,7 @@ class LEB128Test < Minitest::Test
|
|
66
66
|
buffer = StringIO.new
|
67
67
|
buffer.putc(0xc1)
|
68
68
|
buffer.putc(0x57)
|
69
|
-
actual = LEB128.
|
69
|
+
actual = LEB128.encode_unsigned(0x2bc1).string
|
70
70
|
expected = buffer.string
|
71
71
|
assert_equal(expected, actual)
|
72
72
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leb128
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Clayton Bonigut
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -104,6 +104,6 @@ rubyforge_project:
|
|
104
104
|
rubygems_version: 2.5.1
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
|
-
summary: A
|
107
|
+
summary: A set of utility functions for encoding and decoding LEB128-compressed integers.
|
108
108
|
test_files: []
|
109
109
|
has_rdoc:
|