From e48d3ea6565306092ff29164c45567b8afacb273 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 14 Oct 2014 12:13:19 +0200 Subject: [PATCH] faster function to read bytes also add read_bytes0 --- blendfile.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/blendfile.py b/blendfile.py index 556782c..ce07da7 100644 --- a/blendfile.py +++ b/blendfile.py @@ -138,8 +138,8 @@ class BlendFile: self.code_index = {} block = BlendFileBlock(handle, self) - while block.code != "ENDB": - if block.code == "DNA1": + while block.code != b'ENDB': + if block.code == b'DNA1': self.catalog = DNACatalog(self.header, block, handle) else: handle.seek(block.size, os.SEEK_CUR) @@ -152,6 +152,7 @@ class BlendFile: self.blocks.append(block) def find_blocks_from_code(self, code): + assert(type(code) == bytes) if len(code) == 2: code = code if code not in self.code_index: @@ -214,8 +215,8 @@ class BlendFileBlock: if len(data) > 15: blockheader = afile.block_header_struct.unpack(data) - self.code = blockheader[0].decode().split("\0")[0] - if self.code != "ENDB": + self.code = blockheader[0].partition(b'\0')[0] + if self.code != b'ENDB': self.size = blockheader[1] self.addr_old = blockheader[2] self.sdna_index = blockheader[3] @@ -229,7 +230,8 @@ class BlendFileBlock: self.file_offset = 0 else: blockheader = OLDBLOCK.unpack(data) - self.code = blockheader[0].decode().split("\0")[0] + self.code = blockheader[0].partition(b'\0')[0] + self.code = DNA_IO.read_bytes0(blockheader[0], 0) self.size = 0 self.addr_old = 0 self.sdna_index = 0 @@ -350,7 +352,7 @@ class DNACatalog: offset += 4 types_len = intstruct.unpack_from(data, offset)[0] offset += 4 - log.debug("building #"+str(types_len)+" types") + log.debug("building #%d types" % types_len) for i in range(types_len): tType = DNA_IO.read_string0(data, offset) self.types.append([tType, 0, None]) @@ -522,6 +524,7 @@ class DNAStructure: return None + class DNA_IO: """ Module like class, for read-write utility functions. @@ -572,21 +575,19 @@ class DNA_IO: st = DNA_IO._string_struct(length) return st.unpack(handle.read(st.size))[0].decode('utf-8') + + @staticmethod + def read_bytes0(data, offset): + """ + Reads a zero terminating String from a file handle + """ + add = data.find(b'\0', offset) - offset + st = DNA_IO._string_struct(add) + return st.unpack_from(data, offset)[0] + @staticmethod def read_string0(data, offset): - """ - read_string0 reads a zero terminating String from a file handle - """ - add = 0 - - # TODO, faster method! - while data[offset + add] != 0: - add += 1 - - st = DNA_IO._string_struct(add) - - result = st.unpack_from(data, offset)[0].decode('utf-8') - return result + return DNA_IO.read_bytes0(data, offset).decode('utf-8') USHORT = struct.Struct("H") @staticmethod