def _cdata_to_python_inner(data): type_ = typeof(data) kind = type_.kind if kind == 'primitive': return data elif kind == 'pointer': if data == ffi.NULL: return None else: if isinstance(data[0], ffi.CData): return _cdata_to_python_inner(data[0]) else: return data[0] elif kind == 'struct': #d = {} d = OrderedDict() for name, field in type_.fields: kind = field.type.kind if kind == 'primitive': d[name] = getattr(data, name) else: d[name] = _cdata_to_python_inner(getattr(data, name)) return d elif kind == 'array': item = type_.item if item.kind == 'primitive': if item.cname == 'char': if encoding is None: return ffi.string(data) else: return ffi.string(data).decode(encoding) else: return [data[i] for i in range(type_.length)] else: return [_cdata_to_python_inner(data[i]) for i in range(type_.length)]
def _array_to_list(data, item, length): if item.kind == 'primitive': if item.cname == 'char': if encoding is None: return ffi.string(data) else: return ffi.string(data).decode(encoding) else: return [data[i] for i in range(length)] else: return [cdata_to_python_ver2(data[i]) for i in range(length)]