EXtremeZip 2024.9.17 → 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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/exuz +9 -9
  3. data/lib/extremeunzip.zzaqsu.rb +117 -98
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79a440b3028b581112c101f1ccdfe2ef376c917048c4c4d642b3ccaa168a728e
4
- data.tar.gz: f5d2b63d9c77cf336326183beeaa02a2c215ba5ebc11d876e6828528f0aa16e9
3
+ metadata.gz: 19f16e0b5768588a6951f5e5b3680434dc15ac57a470ac6c67d1d7bb86ad6906
4
+ data.tar.gz: 0c3add42a4070d440fd3563fc10851a95e0cdc921f1265310b4fc5a171aff65e
5
5
  SHA512:
6
- metadata.gz: 6494b6cb912425047a68063d0855acc8de6ec7c946e8498741a919e6d66d99319ab03f48866efc7bdaf46a6c7e63021c262eb4d36f519df22c50ec0a3372911c
7
- data.tar.gz: d5061341da8cae1c84275c2d3c8f1ebfbe00b62bd906d432da00cdc7d4e30a9af4e025f7dbce3642329cf50723b90f76b74b24cc4af13b033c3458b0ad5204c9
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
- returnCode = 0 # 失败
8
- $rootPath = ARGV[0] # 记录要打包的目录树的根目录。
7
+ returnCode = 0 # 失败
8
+ $rootPath = ARGV[0] # 记录要打包的目录树的根目录。
9
9
 
10
- exuzObject = ExtremeUnZip.new # 解压对象
10
+ exuzObject = ExtremeUnZip.new # 解压对象
11
11
 
12
- result = exuzObject.exuz($rootPath) # 解压
12
+ result = exuzObject.exuz($rootPath) # 解压
13
13
 
14
- if result # 解压成功
15
- else # 解压失败
16
- returnCode = 1 # 失败
17
- end #if result # 解压成功
14
+ if result # 解压成功
15
+ else # 解压失败
16
+ returnCode = 1 # 失败
17
+ end #if result # 解压成功
18
18
 
19
- exit returnCode # 退出
19
+ exit returnCode # 退出
20
20
  end
@@ -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
- puts("#{lineNumber} , Memory: #{mem.mb}"); # Debug
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 conent: #{wholeCbor['vfsDataList']}" # Debug
21
-
17
+ compressedVfsDataList = []
18
+ startIndix = wholeCbor['vfsDataListStart']
19
+
20
+ puts "whole length: #{@wholeFileContent.length}, list content: #{wholeCbor['vfsDataList']}" # Debug
22
21
 
23
- wholeCbor['vfsDataList'].each do |currentBlockInfo| # 一个个块地处理
24
- length=currentBlockInfo['length'] # 获取长度。
22
+ expected_block_length = nil
23
+
24
+ wholeCbor['vfsDataList'].each do |currentBlockInfo|
25
+ length = currentBlockInfo['length']
25
26
 
26
- currentBlock=@wholeFileContent[startIndix, length] # 读取内容
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
- compressedVfsDataList << currentBlock # 加入当前块
33
+ currentBlock = @wholeFileContent[startIndix, length]
29
34
 
30
- startIndix+=length # 位移。
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
- victoriaFreshData = '' # 解压后的数据块整体
39
- dataFileName = 'victoriafreshdata.w' # 数据文件名
40
- dataFile = {} # 数据文件对象
41
-
42
- if (fileVersion == 14) # 14版本
43
- compressedVfsData = wholeCbor['vfsData'] # 获取压缩后的数据内容
44
-
45
- victoriaFreshData = LZMA.decompress(compressedVfsData) # 解压缩数据内容
46
-
47
- dataFile = File.open(dataFileName, 'wb') # 打开文件
48
-
49
- dataFile.syswrite(victoriaFreshData) # 写入内容
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) # 251 以上版本。要按照偏移值来读取压缩数据块列表。
56
- compressedVfsDataList=readVfsDataList(wholeCbor) # 根据偏移值来读取压缩块数据列表。
57
- end # if (fileVersion>=251) # 251 以上版本
58
+ if (fileVersion >= 251)
59
+ compressedVfsDataList = readVfsDataList(wholeCbor)
60
+ end
58
61
 
59
- puts("data block amont: #{compressedVfsDataList.length}") # Debug
62
+ puts("data block amount: #{compressedVfsDataList.length}")
60
63
 
61
- dataBlockCounter = 0 # Data block counter
64
+ dataBlockCounter = 0
65
+ previous_block_length = nil
62
66
 
63
- dataFile = File.open(dataFileName, 'wb') # 打开文件
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
- compressedVfsDataList.each do |currentCompressed| # 一块块地解压
66
- puts("data block counter: #{dataBlockCounter}") # Debug
67
- checkMemoryUsage(34)
68
-
69
- begin # 解压
70
- currentRawData = LZMA.decompress(currentCompressed) # 解压这一块
71
-
72
- dataFile.syswrite(currentRawData) # 写入内容
73
- rescue RuntimeError => e # 解压失败
74
- puts "Warning: the exz file may be incomplete." # 报告错误。文件可能不完整。
75
- end # begin # 解压
76
-
77
- dataBlockCounter += 1 # count
78
- end # compressedVfsDataList.each do |currentCompressed|
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
- dataFile.close # 关闭文件
81
- end # if (fileVersion==14) #14版本
100
+ dataBlockCounter += 1
101
+ end
102
+ end
103
+ end
82
104
 
83
- dataFileName # 返回解压后的数据块整体
84
- end # def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容
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
- currentBlockFile.close # 关闭文件
111
+ begin
112
+ currentBlockFile = File.new(rootPath, 'rb')
113
+ @wholeFileContent = currentBlockFile.read
114
+ currentBlockFile.close
95
115
 
96
- checkMemoryUsage(60)
116
+ checkMemoryUsage(60)
97
117
 
98
- wholeCborByteArray = @wholeFileContent[4..-1] # 从第5个到末尾
118
+ wholeCborByteArray = @wholeFileContent[4..-1]
99
119
 
100
- begin # 可能出错。
101
- options = {:tolerant => true}
102
-
103
- wholeCbor = CBOR.decode(wholeCborByteArray, options) # 解码
120
+ options = {:tolerant => true}
121
+ wholeCbor = CBOR.decode(wholeCborByteArray, options)
104
122
 
105
- fileVersion = wholeCbor['version'] # 获取版本号
123
+ fileVersion = wholeCbor['version']
106
124
 
107
- if (fileVersion < 14) # 版本号过小
108
- checkMemoryUsage(85)
109
- puts 'file version too old' # 报告错误
110
- else # 版本号够大
111
- compressedVfsMenu = wholeCbor['vfsMenu'] # 获取压缩后的目录内容
112
- puts "compressed vfs menu size: #{compressedVfsMenu.size}" # D3bug
113
-
114
- checkMemoryUsage(90)
115
- replyByteArray = LZMA.decompress(compressedVfsMenu) # 解码目录VFS字节数组内容
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
- checkMemoryUsage(95)
135
+ checkMemoryUsage(95)
118
136
 
119
- victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
137
+ victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion)
120
138
 
121
- checkMemoryUsage(100)
122
- $clipDownloader = VictoriaFresh.new # 创建下载器。
139
+ checkMemoryUsage(100)
140
+ $clipDownloader = VictoriaFresh.new
123
141
 
124
- $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) # 释放各个文件
142
+ $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile)
125
143
 
126
- fileToRemove = File.new(victoriaFreshDataFile) # 要删除的文件
127
- File.delete(fileToRemove) # 删除文件
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
- result = false # 失败
135
- end #begin # 可能出错。
136
- end # def exuz(rootPath)
137
- end # class ExtremeUnZip
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: 2024.9.17
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: 2024-09-15 00:00:00.000000000 Z
11
+ date: 2025-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cod
@@ -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.11
148
+ rubygems_version: 3.5.22
149
149
  signing_key:
150
150
  specification_version: 4
151
151
  summary: EXtremeZip