def _read_header(self): offset = Bit.u32_from(self._fp.read(4)) self._fp.seek(offset) # 读取秘钥 keylen = self._fp.read(1)[0] if keylen > 0: self._parser = self.Parser(keylen) self._parser.load(self._fp.read(keylen + 4)) # 读取hash种子和文件数量 buffer = self._fp.read(4) self._hseed = Bit.u16_from(buffer) filenum = Bit.u16_from(buffer[2:]) # 读取文件表 buffer = self._fp.read(filenum * 12) # tag+pos+len=12 offset = 0 self._hashmap = {} for i in range(filenum): tag = Bit.u32_from(buffer[offset:offset + 4]) offset += 4 pos = Bit.u32_from(buffer[offset:offset + 4]) offset += 4 size = Bit.u32_from(buffer[offset:offset + 4]) offset += 4 self._hashmap[tag] = (pos, size) log.d('unpack bale files:', filenum)
def _out_pkg(self, build_look_map): if not os.path.isdir(self._ulo_path): os.makedirs(self._ulo_path) for excel_name, sheet_dict in self._new_dict.items(): ba = Bit.ByteArray().init_capacity(1024 * 1024 * 8) ba.set_position(2) sheet_nums = self._build_buf(excel_name, sheet_dict, ba) ba.set_position(0).write_u16(sheet_nums) # 写入表的数量 with open(os.path.join(self._ulo_path, excel_name + '.ulo'), 'wb') as fp: fp.write(ba.slim_buffer()) total_nums = 0 for name in os.listdir(self._ulo_path): ulofile = os.path.join(self._ulo_path, name) if FS.filename(name) not in build_look_map: log.w('删除表文件:', ulofile) os.remove(ulofile) else: with open(ulofile, 'rb') as fp: total_nums += Bit.u16_from(fp.read(2)) return total_nums