feh-bin 0.1.3 → 0.2.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/.gitignore +0 -0
- data/Gemfile +0 -0
- data/Gemfile.lock +8 -8
- data/LICENSE.txt +0 -0
- data/README.md +15 -0
- data/Rakefile +0 -0
- data/bin/feh_bin_lz +17 -3
- data/feh-bin.gemspec +3 -3
- data/fuzz/fuzz_feh_bin.rb +0 -0
- data/lib/feh/bin/array_istream.rb +0 -0
- data/lib/feh/bin/array_ostream.rb +0 -1
- data/lib/feh/bin/lz11.rb +0 -0
- data/lib/feh/bin/version.rb +1 -1
- data/lib/feh/bin.rb +31 -8
- metadata +12 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 74bef714ca93f4872ed31bbcab86aebf0ce0cbb9a21737e5db97163a232b5a7c
|
|
4
|
+
data.tar.gz: 9e4da872f92c073dc081f2225f5c0e873a5845641f823e453925a4c9e8b0ff19
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ac92ed5505d6d191209effa0013de9337cd59a7467896fce74303bea59bff67328fcf8bae9ff520afd7e4d9ccdf070979c0b0c57ddc826bec2eab588beccc6e3
|
|
7
|
+
data.tar.gz: 52d400fc11d3f0f2f5e3e190ddec725cb3930e645fbb760e6e36b56061d111f22a3f151640632769ee1b73a6d3ee646ea51a667dd0f5eaf795688072ee0351ef
|
data/.gitignore
CHANGED
|
File without changes
|
data/Gemfile
CHANGED
|
File without changes
|
data/Gemfile.lock
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
feh-bin (0.
|
|
4
|
+
feh-bin (0.2.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
|
-
minitest (5.
|
|
10
|
-
rake (
|
|
9
|
+
minitest (5.18.0)
|
|
10
|
+
rake (13.0.6)
|
|
11
11
|
|
|
12
12
|
PLATFORMS
|
|
13
|
-
|
|
13
|
+
x86_64-linux
|
|
14
14
|
|
|
15
15
|
DEPENDENCIES
|
|
16
|
-
bundler
|
|
16
|
+
bundler
|
|
17
17
|
feh-bin!
|
|
18
|
-
minitest
|
|
19
|
-
rake
|
|
18
|
+
minitest
|
|
19
|
+
rake
|
|
20
20
|
|
|
21
21
|
BUNDLED WITH
|
|
22
|
-
|
|
22
|
+
2.4.6
|
data/LICENSE.txt
CHANGED
|
File without changes
|
data/README.md
CHANGED
|
@@ -16,6 +16,12 @@ To convert `a.bin` to `a.bin.lz`, and `b.bin.lz` to `b.bin`:
|
|
|
16
16
|
$ feh_bin_lz a.bin b.bin.lz
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
If it takes too long to compress a file, try adding `-s` anywhere:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
$ feh_bin_lz -s very_large_file.bin
|
|
23
|
+
```
|
|
24
|
+
|
|
19
25
|
## Library example
|
|
20
26
|
|
|
21
27
|
```ruby
|
|
@@ -28,6 +34,15 @@ end
|
|
|
28
34
|
|
|
29
35
|
## Changelog
|
|
30
36
|
|
|
37
|
+
### V0.2.0
|
|
38
|
+
|
|
39
|
+
- Fix `<internal:pack>:8: warning: unknown pack directive '<' in '<l'` message
|
|
40
|
+
- Allow use of Bundler 2.x
|
|
41
|
+
|
|
42
|
+
### V0.1.4
|
|
43
|
+
|
|
44
|
+
- Added command line option `-s` to `feh_bin_lz` which skips LZ11 compression
|
|
45
|
+
|
|
31
46
|
### V0.1.3
|
|
32
47
|
|
|
33
48
|
- Added read support for non-LZ11-compressed .bin.lz files
|
data/Rakefile
CHANGED
|
File without changes
|
data/bin/feh_bin_lz
CHANGED
|
@@ -3,13 +3,27 @@
|
|
|
3
3
|
require 'feh/bin'
|
|
4
4
|
|
|
5
5
|
DESC = "Fire Emblem Heroes assets converter
|
|
6
|
-
Usage: #{File.basename(__FILE__)} <files>...
|
|
6
|
+
Usage: #{File.basename(__FILE__)} [OPTION] <files>...
|
|
7
7
|
|
|
8
8
|
Files ending in .bin.lz are converted to .bin; all other files are converted
|
|
9
|
-
into .bin.lz.
|
|
9
|
+
into .bin.lz.
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-s Only encrypt files, do not compress using LZ11"
|
|
10
13
|
|
|
11
14
|
abort DESC if ARGV.empty? || ARGV.include?('-?') || ARGV.include?('--help')
|
|
12
15
|
|
|
16
|
+
$no_compress = false
|
|
17
|
+
|
|
18
|
+
ARGV.select {|opt| opt.start_with? '-'}.each do |opt|
|
|
19
|
+
case opt
|
|
20
|
+
when '-s'
|
|
21
|
+
$no_compress = true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
ARGV.reject! {|opt| opt.start_with? '-'}
|
|
26
|
+
|
|
13
27
|
ARGV.each do |fname|
|
|
14
28
|
begin
|
|
15
29
|
buf = IO.binread(fname)
|
|
@@ -24,7 +38,7 @@ ARGV.each do |fname|
|
|
|
24
38
|
outname = File.expand_path(
|
|
25
39
|
File.basename(fname, '.*') + '.bin.lz', File.dirname(fname))
|
|
26
40
|
puts "Compressing #{fname} -> #{outname}..."
|
|
27
|
-
res = Feh::Bin.compress(buf)
|
|
41
|
+
res = Feh::Bin.compress(buf, $no_compress)
|
|
28
42
|
raise RuntimeError, res.to_s if res.is_a?(Symbol)
|
|
29
43
|
IO.binwrite(outname, res.pack('c*'))
|
|
30
44
|
end
|
data/feh-bin.gemspec
CHANGED
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.require_paths = ["lib"]
|
|
23
23
|
spec.extra_rdoc_files = ['README.md']
|
|
24
24
|
|
|
25
|
-
spec.add_development_dependency "bundler", "~>
|
|
26
|
-
spec.add_development_dependency "rake", "~>
|
|
27
|
-
spec.add_development_dependency "minitest", "~> 5
|
|
25
|
+
spec.add_development_dependency "bundler", "~> 2"
|
|
26
|
+
spec.add_development_dependency "rake", "~> 13"
|
|
27
|
+
spec.add_development_dependency "minitest", "~> 5"
|
|
28
28
|
end
|
data/fuzz/fuzz_feh_bin.rb
CHANGED
|
File without changes
|
|
File without changes
|
data/lib/feh/bin/lz11.rb
CHANGED
|
File without changes
|
data/lib/feh/bin/version.rb
CHANGED
data/lib/feh/bin.rb
CHANGED
|
@@ -17,13 +17,18 @@ module Feh
|
|
|
17
17
|
|
|
18
18
|
# Compresses data into a .bin.lz file.
|
|
19
19
|
# @param buf [Array<Integer>, String] content of the data to compress
|
|
20
|
+
# @param no_compress [Boolean] true if LZ11 is not used to compress the data
|
|
20
21
|
# @return [Array<Integer>] content of the .bin.lz file
|
|
21
22
|
# @return [Symbol] error code if the input is not a valid data buffer
|
|
22
|
-
def self.compress(buf)
|
|
23
|
+
def self.compress(buf, no_compress = false)
|
|
23
24
|
buf = buf.bytes if buf.is_a?(String)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
if no_compress
|
|
26
|
+
write_bin_lz04(buf, buf.size)
|
|
27
|
+
else
|
|
28
|
+
buf2 = LZ11.new(buf).compress
|
|
29
|
+
return buf2 if buf2.is_a?(Symbol)
|
|
30
|
+
write_bin_lz(buf2, buf.size)
|
|
31
|
+
end
|
|
27
32
|
end
|
|
28
33
|
|
|
29
34
|
# Unpacks a Fire Emblem Heroes .bin.lz file.
|
|
@@ -35,7 +40,7 @@ module Feh
|
|
|
35
40
|
header = buf.shift(4)
|
|
36
41
|
xorseed = header[1] | (header[2] << 8) | (header[3] << 16)
|
|
37
42
|
if (header.first & 0xFF) == 0x17 && (buf.first & 0xFF) == 0x11
|
|
38
|
-
xorkey = [0x8083 * xorseed].pack('<
|
|
43
|
+
xorkey = [0x8083 * xorseed].pack('l<').bytes
|
|
39
44
|
(4...buf.size).step(4).each do |i|
|
|
40
45
|
4.times {|j| buf[i + j] ^= xorkey[j]}
|
|
41
46
|
4.times {|j| xorkey[j] ^= buf[i + j]}
|
|
@@ -56,7 +61,7 @@ module Feh
|
|
|
56
61
|
header = buf.shift(4)
|
|
57
62
|
xorseed = header[1] | (header[2] << 8) | (header[3] << 16)
|
|
58
63
|
if header.first == 0x04 && xorseed == buf.size
|
|
59
|
-
xorkey = [0x8083 * xorseed].pack('<
|
|
64
|
+
xorkey = [0x8083 * xorseed].pack('l<').bytes
|
|
60
65
|
(0...buf.size).step(4).each do |i|
|
|
61
66
|
4.times {|j| buf[i + j] ^= xorkey[j]}
|
|
62
67
|
4.times {|j| xorkey[j] ^= buf[i + j]}
|
|
@@ -75,13 +80,31 @@ module Feh
|
|
|
75
80
|
bytes = bytes.bytes if bytes.is_a?(String)
|
|
76
81
|
bytes += [0] * ((-bytes.size) % 4)
|
|
77
82
|
xorseed = bytes.size if xorseed.nil?
|
|
78
|
-
header = [xorseed * 0x100 + 0x17].pack('<
|
|
79
|
-
xorkey = [0x8083 * xorseed].pack('<
|
|
83
|
+
header = [xorseed * 0x100 + 0x17].pack('l<').bytes
|
|
84
|
+
xorkey = [0x8083 * xorseed].pack('l<').bytes
|
|
80
85
|
4.times {|j| bytes[4 + j] ^= xorkey[j]}
|
|
81
86
|
(8...bytes.size).step(4).each do |i|
|
|
82
87
|
4.times {|j| bytes[i + j] ^= bytes[i - 4 + j]}
|
|
83
88
|
end
|
|
84
89
|
header + bytes
|
|
85
90
|
end
|
|
91
|
+
|
|
92
|
+
# Packs a Fire Emblem Heroes .bin.lz file.
|
|
93
|
+
# Used for files that are XOR-encrypted for FEH but not LZ11-compressed.
|
|
94
|
+
# @param bytes [Array<Integer>, String] content of an archive
|
|
95
|
+
# @param xorseed [Integer, nil] optional XOR encryption value
|
|
96
|
+
# @return [Array<Integer>] content of the packed .bin.lz file
|
|
97
|
+
def self.write_bin_lz04(bytes, xorseed = nil)
|
|
98
|
+
bytes = bytes.bytes if bytes.is_a?(String)
|
|
99
|
+
bytes += [0] * ((-bytes.size) % 4)
|
|
100
|
+
xorseed = bytes.size if xorseed.nil?
|
|
101
|
+
header = [xorseed * 0x100 + 0x04].pack('l<').bytes
|
|
102
|
+
xorkey = [0x8083 * xorseed].pack('l<').bytes
|
|
103
|
+
4.times {|j| bytes[j] ^= xorkey[j]}
|
|
104
|
+
(4...bytes.size).step(4).each do |i|
|
|
105
|
+
4.times {|j| bytes[i + j] ^= bytes[i - 4 + j]}
|
|
106
|
+
end
|
|
107
|
+
header + bytes
|
|
108
|
+
end
|
|
86
109
|
end
|
|
87
110
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: feh-bin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Quinton Miller
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-03-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -16,42 +16,42 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '2'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '2'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '13'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '13'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: minitest
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '5
|
|
47
|
+
version: '5'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '5
|
|
54
|
+
version: '5'
|
|
55
55
|
description: Functions to compress and decompress binary asset files from Fire Emblem
|
|
56
56
|
Heroes
|
|
57
57
|
email:
|
|
@@ -80,7 +80,7 @@ homepage: https://github.com/HertzDevil/feh-bin
|
|
|
80
80
|
licenses:
|
|
81
81
|
- MIT
|
|
82
82
|
metadata: {}
|
|
83
|
-
post_install_message:
|
|
83
|
+
post_install_message:
|
|
84
84
|
rdoc_options: []
|
|
85
85
|
require_paths:
|
|
86
86
|
- lib
|
|
@@ -95,9 +95,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '0'
|
|
97
97
|
requirements: []
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
signing_key:
|
|
98
|
+
rubygems_version: 3.4.6
|
|
99
|
+
signing_key:
|
|
101
100
|
specification_version: 4
|
|
102
101
|
summary: Conversion routines for Fire Emblem Heroes asset files
|
|
103
102
|
test_files: []
|