使用 gzip 算法对数据进行解压,并包含基础的数据校验。
(self, data: bytes)
| 197 | return gzip.compress(data) |
| 198 | |
| 199 | def _decompress_data(self, data: bytes) -> bytes: |
| 200 | """使用 gzip 算法对数据进行解压,并包含基础的数据校验。""" |
| 201 | # 检查数据是否为空 |
| 202 | if not data or len(data) == 0: |
| 203 | raise StegaPyException( |
| 204 | "数据为空,无法解压", |
| 205 | StegaPyErrors.CORRUPT_DATA, |
| 206 | self.NAMESPACE |
| 207 | ) |
| 208 | |
| 209 | # 检查数据是否是有效的 gzip 格式 |
| 210 | # gzip 文件以 \x1f\x8b 开头 |
| 211 | if len(data) < 2 or data[:2] != b'\x1f\x8b': |
| 212 | raise StegaPyException( |
| 213 | "数据不是有效的 gzip 格式。请检查:\n" |
| 214 | "1. 嵌入数据时是否启用了压缩\n" |
| 215 | "2. 提取数据时的压缩设置是否与嵌入时一致\n" |
| 216 | f"数据前2字节: {data[:2].hex() if len(data) >= 2 else '数据太短'}", |
| 217 | StegaPyErrors.CORRUPT_DATA, |
| 218 | self.NAMESPACE |
| 219 | ) |
| 220 | |
| 221 | try: |
| 222 | return gzip.decompress(data) |
| 223 | except gzip.BadGzipFile as e: |
| 224 | raise StegaPyException( |
| 225 | f"数据解压失败(不是有效的 gzip 文件): {str(e)}\n" |
| 226 | "请检查压缩设置是否与嵌入时一致", |
| 227 | StegaPyErrors.CORRUPT_DATA, |
| 228 | self.NAMESPACE |
| 229 | ) |
| 230 | except Exception as e: |
| 231 | raise StegaPyException( |
| 232 | f"数据解压失败: {str(e)}\n" |
| 233 | "请检查压缩设置是否与嵌入时一致", |
| 234 | StegaPyErrors.CORRUPT_DATA, |
| 235 | self.NAMESPACE |
| 236 | ) |
| 237 |
no test coverage detected