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
Esempio n. 2
0
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
Esempio n. 3
0
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