EXtremeZip 2024.9.16 → 2025.1.28
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/bin/exuz +9 -9
- data/lib/extremeunzip.zzaqsu.rb +117 -98
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19f16e0b5768588a6951f5e5b3680434dc15ac57a470ac6c67d1d7bb86ad6906
|
4
|
+
data.tar.gz: 0c3add42a4070d440fd3563fc10851a95e0cdc921f1265310b4fc5a171aff65e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8f9e5d07d15db0b05c3339e0b935e500009e0e70a2e3ee0ec92f8ddcda25fb4a9a9716fecd0f86c422051b6bb1aa9153f7edd6fc10938ab313f05eabc834e4d
|
7
|
+
data.tar.gz: 94e4c72ae99a0cb7189664198325468faad6fb0f595759b0da5851a83f7efb1e24bb55aa3b662261213aeb273701de95bc1b03c05dd0cb958c54ae9143273774
|
data/bin/exuz
CHANGED
@@ -4,17 +4,17 @@ require 'extremeunzip.zzaqsu'
|
|
4
4
|
|
5
5
|
if ARGV.empty? # 未指定命令行参数。
|
6
6
|
else # 指定了命令行参数。
|
7
|
-
|
8
|
-
|
7
|
+
returnCode = 0 # 失败
|
8
|
+
$rootPath = ARGV[0] # 记录要打包的目录树的根目录。
|
9
9
|
|
10
|
-
|
10
|
+
exuzObject = ExtremeUnZip.new # 解压对象
|
11
11
|
|
12
|
-
|
12
|
+
result = exuzObject.exuz($rootPath) # 解压
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
if result # 解压成功
|
15
|
+
else # 解压失败
|
16
|
+
returnCode = 1 # 失败
|
17
|
+
end #if result # 解压成功
|
18
18
|
|
19
|
-
|
19
|
+
exit returnCode # 退出
|
20
20
|
end
|
data/lib/extremeunzip.zzaqsu.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
1
|
require 'victoriafresh'
|
4
2
|
require 'cbor'
|
5
3
|
require 'lzma'
|
@@ -7,131 +5,152 @@ require 'get_process_mem'
|
|
7
5
|
|
8
6
|
def checkMemoryUsage(lineNumber)
|
9
7
|
mem = GetProcessMem.new
|
10
|
-
|
11
|
-
|
12
|
-
end # def checkMemoryUsage
|
8
|
+
puts("#{lineNumber} , Memory: #{mem.mb}") # Debug
|
9
|
+
end
|
13
10
|
|
14
11
|
class ExtremeUnZip
|
15
|
-
|
12
|
+
def initialize
|
13
|
+
# 移除 StreamDecoder 初始化,改为直接调用 LZMA.decompress
|
14
|
+
end
|
15
|
+
|
16
16
|
def readVfsDataList(wholeCbor)
|
17
|
-
compressedVfsDataList = []
|
18
|
-
startIndix=wholeCbor['vfsDataListStart']
|
19
|
-
|
20
|
-
puts "whole length: #{@wholeFileContent.length}, list
|
21
|
-
|
17
|
+
compressedVfsDataList = []
|
18
|
+
startIndix = wholeCbor['vfsDataListStart']
|
19
|
+
|
20
|
+
puts "whole length: #{@wholeFileContent.length}, list content: #{wholeCbor['vfsDataList']}" # Debug
|
22
21
|
|
23
|
-
|
24
|
-
|
22
|
+
expected_block_length = nil
|
23
|
+
|
24
|
+
wholeCbor['vfsDataList'].each do |currentBlockInfo|
|
25
|
+
length = currentBlockInfo['length']
|
25
26
|
|
26
|
-
|
27
|
+
if expected_block_length.nil?
|
28
|
+
expected_block_length = length
|
29
|
+
elsif length != expected_block_length
|
30
|
+
puts "Warning: unexpected block length detected. Expected: #{expected_block_length}, got: #{length}"
|
31
|
+
end
|
27
32
|
|
28
|
-
|
33
|
+
currentBlock = @wholeFileContent[startIndix, length]
|
29
34
|
|
30
|
-
|
35
|
+
compressedVfsDataList << currentBlock
|
36
|
+
|
37
|
+
startIndix += length
|
31
38
|
end
|
32
|
-
|
33
|
-
compressedVfsDataList
|
39
|
+
|
40
|
+
compressedVfsDataList
|
34
41
|
end
|
35
42
|
|
36
|
-
# 根据版本号,提取VFS数据内容
|
37
43
|
def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
dataFile.close # 关闭文件
|
52
|
-
elsif (fileVersion >= 30) # 30以上版本
|
53
|
-
compressedVfsDataList = wholeCbor['vfsDataList'] # 获取压缩后的数据块列表
|
44
|
+
dataFileName = 'victoriafreshdata.w'
|
45
|
+
expected_block_length = nil
|
46
|
+
|
47
|
+
if (fileVersion == 14)
|
48
|
+
compressedVfsData = wholeCbor['vfsData']
|
49
|
+
victoriaFreshData = LZMA.decompress(compressedVfsData)
|
50
|
+
|
51
|
+
File.open(dataFileName, 'wb') do |dataFile|
|
52
|
+
dataFile.syswrite(victoriaFreshData)
|
53
|
+
puts "After writing initial block, raw data file size: #{File.size(dataFileName)}"
|
54
|
+
end
|
55
|
+
elsif (fileVersion >= 30)
|
56
|
+
compressedVfsDataList = wholeCbor['vfsDataList']
|
54
57
|
|
55
|
-
if (fileVersion>=251)
|
56
|
-
compressedVfsDataList=readVfsDataList(wholeCbor)
|
57
|
-
end
|
58
|
+
if (fileVersion >= 251)
|
59
|
+
compressedVfsDataList = readVfsDataList(wholeCbor)
|
60
|
+
end
|
58
61
|
|
59
|
-
puts("data block
|
62
|
+
puts("data block amount: #{compressedVfsDataList.length}")
|
60
63
|
|
61
|
-
dataBlockCounter = 0
|
64
|
+
dataBlockCounter = 0
|
65
|
+
previous_block_length = nil
|
62
66
|
|
63
|
-
|
67
|
+
File.open(dataFileName, 'wb') do |dataFile|
|
68
|
+
compressedVfsDataList.each_with_index do |currentCompressed, index|
|
69
|
+
puts("data block counter: #{dataBlockCounter}")
|
70
|
+
checkMemoryUsage(34)
|
64
71
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
72
|
+
begin
|
73
|
+
currentRawData = LZMA.decompress(currentCompressed)
|
74
|
+
|
75
|
+
if previous_block_length.nil?
|
76
|
+
previous_block_length = currentRawData.length
|
77
|
+
expected_block_length ||= previous_block_length
|
78
|
+
elsif currentRawData.length != previous_block_length || currentRawData.length == 0
|
79
|
+
if currentRawData.length == 0
|
80
|
+
puts "Warning: decompressed block length is zero at block #{index}. Generating fake data of expected length."
|
81
|
+
# 如果当前解压数据长度为0,则创建一个指定长度的伪造数据块
|
82
|
+
currentRawData = "\x00" * expected_block_length
|
83
|
+
else
|
84
|
+
puts "Warning: unexpected decompressed block length detected at block #{index}. Previous length: #{previous_block_length}, current length: #{currentRawData.length}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
dataFile.syswrite(currentRawData)
|
89
|
+
puts "After writing block #{index}, raw data file size: #{File.size(dataFileName)}"
|
90
|
+
rescue RuntimeError => e
|
91
|
+
puts "Warning: the exz file may be incomplete at block #{index}. Error: #{e.message}"
|
92
|
+
|
93
|
+
# 创建一个填充用的假数据块
|
94
|
+
fake_data_block = "\x00" * expected_block_length
|
95
|
+
dataFile.syswrite(fake_data_block)
|
96
|
+
puts "After writing fake block #{index}, raw data file size: #{File.size(dataFileName)}"
|
97
|
+
next
|
98
|
+
end
|
79
99
|
|
80
|
-
|
81
|
-
|
100
|
+
dataBlockCounter += 1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
82
104
|
|
83
|
-
dataFileName
|
84
|
-
end
|
105
|
+
dataFileName
|
106
|
+
end
|
85
107
|
|
86
|
-
# 解压
|
87
108
|
def exuz(rootPath)
|
88
|
-
result = true
|
89
|
-
|
90
|
-
currentBlockFile = File.new(rootPath, 'rb') # 打开文件
|
91
|
-
|
92
|
-
@wholeFileContent = currentBlockFile.read # 读取全部内容
|
109
|
+
result = true
|
93
110
|
|
94
|
-
|
111
|
+
begin
|
112
|
+
currentBlockFile = File.new(rootPath, 'rb')
|
113
|
+
@wholeFileContent = currentBlockFile.read
|
114
|
+
currentBlockFile.close
|
95
115
|
|
96
|
-
|
116
|
+
checkMemoryUsage(60)
|
97
117
|
|
98
|
-
|
118
|
+
wholeCborByteArray = @wholeFileContent[4..-1]
|
99
119
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
wholeCbor = CBOR.decode(wholeCborByteArray, options) # 解码
|
120
|
+
options = {:tolerant => true}
|
121
|
+
wholeCbor = CBOR.decode(wholeCborByteArray, options)
|
104
122
|
|
105
|
-
|
123
|
+
fileVersion = wholeCbor['version']
|
106
124
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
125
|
+
if (fileVersion < 14)
|
126
|
+
checkMemoryUsage(85)
|
127
|
+
puts 'file version too old'
|
128
|
+
else
|
129
|
+
compressedVfsMenu = wholeCbor['vfsMenu']
|
130
|
+
puts "compressed vfs menu size: #{compressedVfsMenu.size}"
|
131
|
+
|
132
|
+
checkMemoryUsage(90)
|
133
|
+
replyByteArray = LZMA.decompress(compressedVfsMenu)
|
116
134
|
|
117
|
-
|
135
|
+
checkMemoryUsage(95)
|
118
136
|
|
119
|
-
|
137
|
+
victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
|
120
138
|
|
121
|
-
|
122
|
-
|
139
|
+
checkMemoryUsage(100)
|
140
|
+
$clipDownloader = VictoriaFresh.new
|
123
141
|
|
124
|
-
|
142
|
+
$clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile)
|
125
143
|
|
126
|
-
|
127
|
-
|
128
|
-
end # if (fileVersion<14) #版本号过小
|
129
|
-
|
130
|
-
result =true # 解压成功
|
131
|
-
rescue EOFError => e # 文件内容提前到末尾。一般是压缩包文件未传输完全 。
|
132
|
-
puts "Error: the exz file may be incomplete." # 报告错误。文件可能不完整。
|
144
|
+
File.delete(victoriaFreshDataFile)
|
145
|
+
end
|
133
146
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
147
|
+
result = true
|
148
|
+
rescue EOFError => e
|
149
|
+
puts "Error: the exz file may be incomplete. Error: #{e.message}"
|
150
|
+
result = false
|
151
|
+
rescue => e
|
152
|
+
puts "Unexpected error: #{e.message}"
|
153
|
+
result = false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: EXtremeZip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2025.1.28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hxcan Cai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cod
|
@@ -86,20 +86,20 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2024.9.
|
89
|
+
version: 2024.9.17
|
90
90
|
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2024.9.
|
92
|
+
version: 2024.9.17
|
93
93
|
type: :runtime
|
94
94
|
prerelease: false
|
95
95
|
version_requirements: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
97
|
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: 2024.9.
|
99
|
+
version: 2024.9.17
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 2024.9.
|
102
|
+
version: 2024.9.17
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: hx_cbor
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
|
-
rubygems_version: 3.5.
|
148
|
+
rubygems_version: 3.5.22
|
149
149
|
signing_key:
|
150
150
|
specification_version: 4
|
151
151
|
summary: EXtremeZip
|