def test_is_array_of_basic_instance(self): valids = [arra1(), arra5(), arra6()] invalids = [v for v in self.tests if v not in valids] # we need instances to be invalid invalids.extend([arra2(), arra3(), arra4(), ]) for var in valids: self.assertTrue(ctypes.is_array_of_basic_instance(var), var) for var in invalids: self.assertFalse(ctypes.is_array_of_basic_instance(var), var) return
def array2bytes(array): """Converts an array of undetermined Basic Ctypes class to a byte string, by guessing it's type from it's class name. This is a bad example of introspection. """ import ctypes if isinstance(array, str): # special case for c_char[] return array if ctypes.is_array_of_basic_instance(array): sb = b''.join([pack(array._type_._type_, el) for el in array]) return sb else: c_size = ctypes.sizeof(array) a2 = (ctypes.c_ubyte * c_size).from_address(ctypes.addressof(array)) sb = b''.join([pack('B', el) for el in a2]) return sb
def ctypes_to_python_array(array): """Converts an array of undetermined Basic Ctypes class to a python array, by guessing it's type from it's class name. This is a bad example of introspection. """ import ctypes if isinstance(array, str): # special case for c_char[] return array if not ctypes.is_array_of_basic_instance(array): raise TypeError('NOT-AN-Basic-Type-ARRAY') if array._type_ in [ctypes.c_int, ctypes.c_uint, ctypes.c_long, ctypes.c_ulong, ctypes.c_ubyte, ctypes.c_byte]: return [long(el) for el in array] if array._type_ in [ctypes.c_float, ctypes.c_double, ctypes.c_longdouble]: return [float(el) for el in array] sb = ''.join([pack(array._type_._type_, el) for el in array]) return sb