python reader can read v2 archives (non-fixed leaf level) [#36]

This commit is contained in:
Brandon Liu
2022-03-17 15:50:17 +08:00
parent 3784132161
commit c9b0ddc558
2 changed files with 18 additions and 8 deletions

View File

@@ -18,7 +18,12 @@ with read(sys.argv[1]) as reader:
print('root entries:', reader.root_entries) print('root entries:', reader.root_entries)
print('leaf directories:', len(set(reader.leaves.values()))) print('leaf directories:', len(set(reader.leaves.values())))
elif len(sys.argv) == 3: elif len(sys.argv) == 3:
print("list") for k,v in reader.root_dir.items():
print(f"{k[0]} {k[1]} {k[2]} {v[0]} {v[1]}")
for val in set(reader.leaves.values()):
leaf_dir, _ = reader.load_directory(val[0],val[1]//17)
for k,v in leaf_dir.items():
print(f"{k[0]} {k[1]} {k[2]} {v[0]} {v[1]}")
else: else:
z = int(sys.argv[2]) z = int(sys.argv[2])
x = int(sys.argv[3]) x = int(sys.argv[3])

View File

@@ -53,14 +53,19 @@ class Reader:
def root_entries(self): def root_entries(self):
return int.from_bytes(self.mmap[8:10],byteorder='little') return int.from_bytes(self.mmap[8:10],byteorder='little')
@property
def leaf_level(self):
return next(iter(self.leaves))[0]
def get(self,z,x,y): def get(self,z,x,y):
val = self.root_dir.get((z,x,y)) val = self.root_dir.get((z,x,y))
if val: if val:
return self.mmap[val[0]:val[0]+val[1]] return self.mmap[val[0]:val[0]+val[1]]
else: else:
z7_tile_diff = z - 7 if len(self.leaves) > 0:
z7_tile = (7,x // (1 << z7_tile_diff),y // (1 << z7_tile_diff)) level_diff = z - self.leaf_level
val = self.leaves.get(z7_tile) leaf = (self.leaf_level,x // (1 << level_diff),y // (1 << level_diff))
val = self.leaves.get(leaf)
if val: if val:
directory, _ = self.load_directory(val[0],val[1]//17) directory, _ = self.load_directory(val[0],val[1]//17)
val = directory.get((z,x,y)) val = directory.get((z,x,y))