def to_bytes(self): string = b"" for name, tag in self.value.items(): string += Buffer.pack('b', _ids[type(tag)]) string += TagString(name).to_bytes() string += tag.to_bytes() if len(self.value) == 0 or not self.root: string += Buffer.pack('b', 0) return string
def save_chunk(self, chunk): """ Saves the given chunk, which should be a ``TagRoot``, to the region file. """ # Compress chunk chunk_x = chunk.body.value["Level"].value["xPos"].value chunk_z = chunk.body.value["Level"].value["zPos"].value chunk = zlib.compress(chunk.to_bytes()) chunk = Buffer.pack('IB', len(chunk), 2) + chunk chunk_length = 1 + (len(chunk) - 1) // 4096 # Load extents extents = [(0, 2)] self.fd.seek(0) buff = Buffer(self.fd.read(4096)) for idx in range(1024): z, x = divmod(idx, 32) entry = buff.unpack('I') offset, length = entry >> 8, entry & 0xFF if offset > 0 and not (x == chunk_x and z == chunk_z): extents.append((offset, length)) extents.sort() extents.append((extents[-1][0] + extents[-1][1] + chunk_length, 0)) # Compute new extent for idx in range(len(extents) - 1): start = extents[idx][0] + extents[idx][1] end = extents[idx + 1][0] if (end - start) >= chunk_length: chunk_offset = start extents.insert(idx + 1, (chunk_offset, chunk_length)) break # Write extent header self.fd.seek(4 * (32 * chunk_z + chunk_x)) self.fd.write( Buffer.pack('I', (chunk_offset << 8) | (chunk_length & 0xFF))) # Write timestamp header self.fd.seek(4096 + 4 * (32 * chunk_z + chunk_x)) self.fd.write(Buffer.pack('I', int(time.time()))) # Write chunk self.fd.seek(4096 * chunk_offset) self.fd.write(chunk) # Truncate file self.fd.seek(4096 * extents[-1][0]) self.fd.truncate()
def to_bytes(self): if len(self.value) > 0: head = self.value[0] else: head = TagByte(0) return Buffer.pack('bi', _ids[type(head)], len(self.value)) + \ b"".join(tag.to_bytes() for tag in self.value)
def test_pack(): for fmt, data, values in pack_unpack_vectors: if not isinstance(values, tuple): values = (values,) assert Buffer.pack(fmt, *values) == data
def to_bytes(self): data = self.value.to_bytes() data = Buffer.pack('i', len(data) // (self.width // 8)) + data return data
def to_bytes(self): return Buffer.pack(self.fmt, self.value)
def to_bytes(self): data = self.value.encode('utf8') return Buffer.pack('H', len(data)) + data