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. ;)
This commit is contained in:
2016-12-01 13:00:30 +01:00
committed by Sybren A. Stüvel
parent 48ed23a261
commit 250c35ce12

View File

@@ -771,6 +771,7 @@ class DNAStruct:
dna_type = field.dna_type dna_type = field.dna_type
dna_name = field.dna_name dna_name = field.dna_name
dna_size = field.dna_size
if dna_name.is_pointer: if dna_name.is_pointer:
return DNA_IO.read_pointer(handle, header) 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) for i in range(dna_name.array_size)]
return DNA_IO.read_float(handle, header) return DNA_IO.read_float(handle, header)
elif dna_type.dna_type_id == b'char': 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_str:
if use_nil: if use_nil:
return DNA_IO.read_string0(handle, dna_name.array_size) return DNA_IO.read_string0(handle, dna_name.array_size)
@@ -885,6 +889,13 @@ class DNA_IO:
add = data.find(b'\0') add = data.find(b'\0')
return data[:add] return data[:add]
UCHAR = struct.Struct(b'<b'), 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'), struct.Struct(b'>H') USHORT = struct.Struct(b'<H'), struct.Struct(b'>H')
@staticmethod @staticmethod