Untitled

 avatar
unknown
plain_text
5 months ago
1.8 kB
6
Indexable
class AnvilFile:
    def __init__(self, file_path):
        self.file_path = file_path
        self.locations = []
        self.timestamps = []
        self.chunks = []
    def write(self,filepath):
        with open(filepath,'wb') as f:
            for location in self.locations:
                f.write(struct.pack('>I', location))
            for timestamp in self.timestamps:
                f.write(struct.pack('>I', timestamp))
            #f.seek(8192)
            print(len(self.chunks))
            for chunk in self.chunks:
                if chunk is not None:
                    length, compression_type, compression_data = chunk
                    f.write(struct.pack('>I', length))
                    f.write(struct.pack('>B', compression_type))
                    f.write(compression_data)
                    # Pad to 4KiB alignment
                    padding = 4096 - (length + 4) % 4096
                    if padding < 4096:
                        f.write(b'\x00' * padding)
    def load(self):
        with open(self.file_path, 'rb') as f:
            # Read the header (chunk location table)
            self.locations = [struct.unpack('>I', f.read(4))[0] for _ in range(1024)]
            self.timestamps = [struct.unpack('>I', f.read(4))[0] for _ in range(1024)]
            print(len(self.locations))
            #print(self.timestamps)
            for index, offset in enumerate(self.locations):
                if offset != 0:
                    sector_offset = (offset >> 8) * 4096
                    f.seek(sector_offset)
                    length = struct.unpack('>I', f.read(4))[0]
                    compression_type = struct.unpack('>B', f.read(1))[0]
                    chunk_data = f.read(length - 1)
					self.chunks.append((length, compression_type, chunk_data))
Editor is loading...
Leave a Comment