#!/usr/bin/env python3 import struct, zlib, os, datetime mask, pos = 2 ** 32 - 16, 32 base_path = os.path.abspath("awvs_script_blob_decode_" + datetime.date.today().isoformat()) with open('wvsc_blob.bin', 'rb') as fp: s = fp.read() while pos < len(s): file_len = struct.unpack('<I', s[pos:pos + 4])[0] d = zlib.decompress(s[pos + 4: pos + 4 + file_len]) path_len = ord(struct.unpack('<c', d[1:2])[0]) path = os.path.join(base_path, bytes.decode(d[2 + 1: 2 + path_len])) os.makedirs(os.path.dirname(path), exist_ok=True) open(path, 'wb').write(d[2 + path_len + 1 + 2 + (1 if (len(d) - path_len - 3) > 2 ** 14 else 0) + (1 if (len(d) - path_len - 3) > 2 ** 21 else 0):]) pos += ((file_len + 4) & mask) + 16 代码解析
时间: 2024-02-26 19:54:09 浏览: 146
这段代码是用 Python3 编写的,它的作用是解码 awvs_script_blob_decode_YYYY-MM-DD 目录下的 wvsc_blob.bin 文件,并将其中的文件解压缩并保存到相应的文件路径中。
具体来说,它首先读取 wvsc_blob.bin 文件的内容,并将当前位置 pos 初始化为 32。然后,它进入一个循环,每次从 s[pos:pos+4] 中读取一个 4 字节的文件长度 file_len,再从 s[pos+4:pos+4+file_len] 中读取一个压缩后的二进制字符串 d。接下来,它从 d[1:2] 中读取一个长度 path_len,再从 d[2+1:2+path_len] 中读取文件路径 path,并创建路径中所有不存在的目录。最后,它将 d[2+path_len+1+2:] 中的数据写入到 path 文件中,并将 pos 增加 ((file_len+4)&mask)+16 的值。
其中,mask 的值是 2^32-16,即用来保证每个文件长度都是 16 的倍数;base_path 是 awvs_script_blob_decode_YYYY-MM-DD 目录的绝对路径,可以通过 os.path.abspath() 函数得到;ord(struct.unpack('<c', d[1:2])[0]) 是将 d[1:2] 中的一个字节转换为整数,用来表示文件路径的长度。
阅读全文