From 250c35ce1297d010063e575e7f71dcc59d448fcc Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 1 Dec 2016 13:00:30 +0100 Subject: [PATCH] blendfile.py: Add support reading single char DNA values as unsigned integer. A single char is nearly never a string or byte, but rather a small int or bitflag value. ;) --- bam/blend/blendfile.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bam/blend/blendfile.py b/bam/blend/blendfile.py index 0b88f20..69e8aea 100644 --- a/bam/blend/blendfile.py +++ b/bam/blend/blendfile.py @@ -771,6 +771,7 @@ class DNAStruct: dna_type = field.dna_type dna_name = field.dna_name + dna_size = field.dna_size if dna_name.is_pointer: return DNA_IO.read_pointer(handle, header) @@ -791,6 +792,9 @@ class DNAStruct: return [DNA_IO.read_float(handle, header) for i in range(dna_name.array_size)] return DNA_IO.read_float(handle, header) elif dna_type.dna_type_id == b'char': + if dna_size == 1: + # Single char, assume it's bitflag or int value, and not a string/bytes data... + return DNA_IO.read_char(handle, header) if use_str: if use_nil: return DNA_IO.read_string0(handle, dna_name.array_size) @@ -885,6 +889,13 @@ class DNA_IO: add = data.find(b'\0') return data[:add] + UCHAR = struct.Struct(b'b') + + @staticmethod + def read_char(handle, fileheader): + st = DNA_IO.UCHAR[fileheader.endian_index] + return st.unpack(handle.read(st.size))[0] + USHORT = struct.Struct(b'H') @staticmethod