def _address_as_buffer(address, nbyte, readonly=False):
if address is None:
raise ValueError("Cannot create buffer from NULL pointer")
# Note: This doesn't work as a buffer when using pypy
# return (ctypes.c_byte*nbyte).from_address(address)
# Note: This works as a buffer in regular python and pypy
# Note: int_asbuffer is undocumented; see here:
# https://mail.scipy.org/pipermail/numpy-discussion/2008-January/030938.html
return np.core.multiarray.int_asbuffer(
address, nbyte, readonly=readonly, check=False)
python类c_byte()的实例源码
def win32_version_string():
import ctypes
class OSVERSIONINFOEXW(ctypes.Structure):
_fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
('dwMajorVersion', ctypes.c_ulong),
('dwMinorVersion', ctypes.c_ulong),
('dwBuildNumber', ctypes.c_ulong),
('dwPlatformId', ctypes.c_ulong),
('szCSDVersion', ctypes.c_wchar*128),
('wServicePackMajor', ctypes.c_ushort),
('wServicePackMinor', ctypes.c_ushort),
('wSuiteMask', ctypes.c_ushort),
('wProductType', ctypes.c_byte),
('wReserved', ctypes.c_byte)]
"""
Get's the OS major and minor versions. Returns a tuple of
(OS_MAJOR, OS_MINOR).
"""
os_version = OSVERSIONINFOEXW()
os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
if retcode != 0:
raise Exception("Failed to get OS version")
version_string = "Version:%d-%d; Build:%d; Platform:%d; CSD:%s; ServicePack:%d-%d; Suite:%d; ProductType:%d" % (
os_version.dwMajorVersion, os_version.dwMinorVersion,
os_version.dwBuildNumber,
os_version.dwPlatformId,
os_version.szCSDVersion,
os_version.wServicePackMajor, os_version.wServicePackMinor,
os_version.wSuiteMask,
os_version.wReserved
)
return version_string
def addc(self, a, b, c):
if 0 == self.pc_state.P.get_D():
r = ctypes.c_short(a + b + c).value
rc = ctypes.c_byte(a + b + c).value
self.pc_state.P.set_N((0,1)[0x80 == (rc & 0x80)])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
self.pc_state.P.set_V((0,1)[rc != r]) # Overflow
r = ((a & 0xFF) + (b & 0xFF) + c) & 0xFFFF
self.pc_state.P.set_C((0,1)[0x100 == (r & 0x100)])
result = (a + b + c)
elif 1 == self.pc_state.P.get_D():
# Decimal Addition
# FIXME need to fix flags
#
r = ctypes.c_short(((a >> 4) & 0xF)* 10+ ((a & 0xF) %10) + ((b>>4) & 0xF)* 10 + ((b & 0xF) %10) + c).value
rc = ctypes.c_byte(a + b + c).value # ???? TODO
self.pc_state.P.set_N((0,1)[r < 0])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
# self.pc_state.P.V = (rc != r) ? 1:0; # Overflow
self.pc_state.P.set_C((0,1)[(r > 99) or (r < 0)])
result = (((((r/10) % 10) << 4) & 0xf0) + (r%10))
return result & 0xFF
def subc(self, a, b, c):
if 0 == self.pc_state.P.get_D():
r = ctypes.c_short(ctypes.c_byte(a).value - ctypes.c_byte(b).value - ctypes.c_byte(c).value).value
rs = ctypes.c_byte((a - b - c) & 0xFF).value
self.pc_state.P.set_N((0,1)[0x80 == (rs & 0x80)]) # Negative
self.pc_state.P.set_Z((0,1)[rs == 0]) # Zero
self.pc_state.P.set_V((0,1)[r != rs]) # Overflow
r = a - b - c
self.pc_state.P.set_C((1,0)[0x100 == (r & 0x100)]) # Carry (not borrow
result = a - b - c
elif 1 == self.pc_state.P.get_D():
# Decimal subtraction
# FIXME need to fix flags
r = ctypes.c_short(((a >> 4) & 0xF)* 10+ ((a & 0xF) %10) - (((b>>4) & 0xF)* 10 + ((b & 0xF) %10)) - c).value
# rc = a + b + c
self.pc_state.P.set_N((0,1)[r < 0])
self.pc_state.P.set_Z((0,1)[r == 0x0])
# Need to check/fix conditions for V
# self.pc_state.P.V = (rc != r) ? 1:0; # Overflow
self.pc_state.P.set_V(1) # Overflow
self.pc_state.P.set_C((0,1)[(r >= 0) and (r <= 99)])
result = (((int(r/10) % 10) << 4) & 0xf0) + (r%10)
return result & 0xFF
def cmp(self, a, b):
r = ctypes.c_short(ctypes.c_byte(a).value - ctypes.c_byte(b).value).value
rs = ctypes.c_byte(a - b).value
self.pc_state.P.set_N((0,1)[0x80 == (rs & 0x80)]) # Negative
self.pc_state.P.set_Z((0,1)[rs == 0]) # Zero
r = (a & 0xFF) - (b & 0xFF)
self.pc_state.P.set_C((1,0)[0x100 == (r & 0x100)]) # Carry (not borrow)
def _hmove_clocks(self, hm):
# hm - int8
# Need to ensure 'hm' maintains negative when shifted.
clock_shift = 0
# 'hm >= 0x80' is negative move.
clock_shift = ctypes.c_byte(hm).value >> 4
return clock_shift
def addc(self, a, b, c):
if 0 == self.pc_state.P.get_D():
r = ctypes.c_short(a + b + c).value
rc = ctypes.c_byte(a + b + c).value
self.pc_state.P.set_N((0,1)[0x80 == (rc & 0x80)])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
self.pc_state.P.set_V((0,1)[rc != r]) # Overflow
r = ((a & 0xFF) + (b & 0xFF) + c) & 0xFFFF
self.pc_state.P.set_C((0,1)[0x100 == (r & 0x100)])
result = (a + b + c)
elif 1 == self.pc_state.P.get_D():
# Decimal Addition
# FIXME need to fix flags
#
r = ctypes.c_short(((a >> 4) & 0xF)* 10+ ((a & 0xF) %10) + ((b>>4) & 0xF)* 10 + ((b & 0xF) %10) + c).value
rc = ctypes.c_byte(a + b + c).value # ???? TODO
self.pc_state.P.set_N((0,1)[r < 0])
self.pc_state.P.set_Z((0,1)[rc == 0x0])
# self.pc_state.P.V = (rc != r) ? 1:0; # Overflow
self.pc_state.P.set_C((0,1)[(r > 99) or (r < 0)])
result = ((((int(r/10) % 10) << 4) & 0xf0) + (r%10))
return result & 0xFF
def cmp(self, a, b):
r = ctypes.c_short(ctypes.c_byte(a).value - ctypes.c_byte(b).value).value
rs = ctypes.c_byte(a - b).value
self.pc_state.P.set_N((0,1)[0x80 == (rs & 0x80)]) # Negative
self.pc_state.P.set_Z((0,1)[rs == 0]) # Zero
r = (a & 0xFF) - (b & 0xFF)
self.pc_state.P.set_C((1,0)[0x100 == (r & 0x100)]) # Carry (not borrow)
def GetBool(self):
value = C.c_byte()
self._GetBool(self.handle, C.byref(value))
return value.value
def simxSetVisionSensorImage(clientID, sensorHandle, image, options, operationMode):
'''
Please have a look at the function description/documentation in the V-REP user manual
'''
size = len(image)
image_bytes = (ct.c_byte*size)(*image)
return c_SetVisionSensorImage(clientID, sensorHandle, image_bytes, size, options, operationMode)
def _create_bitmap(self, width, height):
self._data = (ctypes.c_byte * (4 * width * height))()
self._bitmap = ctypes.c_void_p()
self._format = PixelFormat32bppARGB
gdiplus.GdipCreateBitmapFromScan0(width, height, width * 4,
self._format, self._data, ctypes.byref(self._bitmap))
self._graphics = ctypes.c_void_p()
gdiplus.GdipGetImageGraphicsContext(self._bitmap,
ctypes.byref(self._graphics))
gdiplus.GdipSetPageUnit(self._graphics, UnitPixel)
self._dc = user32.GetDC(0)
gdi32.SelectObject(self._dc, self.font.hfont)
gdiplus.GdipSetTextRenderingHint(self._graphics,
TextRenderingHintAntiAliasGridFit)
self._brush = ctypes.c_void_p()
gdiplus.GdipCreateSolidFill(0xffffffff, ctypes.byref(self._brush))
self._matrix = ctypes.c_void_p()
gdiplus.GdipCreateMatrix(ctypes.byref(self._matrix))
self._flags = (DriverStringOptionsCmapLookup |
DriverStringOptionsRealizedAdvance)
self._rect = Rect(0, 0, width, height)
self._bitmap_height = height
def __init__(self, size):
self.size = size
self.array = (ctypes.c_byte * size)()
self.ptr = ctypes.cast(self.array, ctypes.c_void_p).value
def resize(self, size):
array = (ctypes.c_byte * size)()
ctypes.memmove(array, self.array, min(size, self.size))
self.size = size
self.array = array
self.ptr = ctypes.cast(self.array, ctypes.c_void_p).value
def map(self, invalidate=False):
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)
glBindBuffer(self.target, self.id)
if invalidate:
glBufferData(self.target, self.size, None, self.usage)
ptr = ctypes.cast(glMapBuffer(self.target, GL_WRITE_ONLY),
ctypes.POINTER(ctypes.c_byte * self.size)).contents
glPopClientAttrib()
return ptr
def __init__(self, size, target, usage):
super(MappableVertexBufferObject, self).__init__(size, target, usage)
self.data = (ctypes.c_byte * size)()
self.data_ptr = ctypes.cast(self.data, ctypes.c_void_p).value
self._dirty_min = sys.maxsize
self._dirty_max = 0
def resize(self, size):
data = (ctypes.c_byte * size)()
ctypes.memmove(data, self.data, min(size, self.size))
self.data = data
self.data_ptr = ctypes.cast(self.data, ctypes.c_void_p).value
self.size = size
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)
glBindBuffer(self.target, self.id)
glBufferData(self.target, self.size, self.data, self.usage)
glPopClientAttrib()
self._dirty_min = sys.maxsize
self._dirty_max = 0
def hex_dump_memory(ptr, num):
import ctypes
s = ''
n = 0
lines = []
data = list((num * ctypes.c_byte).from_address(ptr))
if len(data) == 0:
return '<empty>'
for i in range(0, num, 16):
line = ''
line += '%04x | ' % (ptr + i)
n += 16
for j in range(n-16, n):
if j >= len(data): break
line += '%02x ' % (data[j] & 0xff)
line += ' ' * (3 * 16 + 7 - len(line)) + ' | '
for j in range(n-16, n):
if j >= len(data): break
c = data[j] if not (data[j] < 0x20 or data[j] > 0x7e) else '.'
line += '%c' % c
lines.append(line)
return '\n'.join(lines)
def win32_version_string():
import ctypes
class OSVERSIONINFOEXW(ctypes.Structure):
_fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
('dwMajorVersion', ctypes.c_ulong),
('dwMinorVersion', ctypes.c_ulong),
('dwBuildNumber', ctypes.c_ulong),
('dwPlatformId', ctypes.c_ulong),
('szCSDVersion', ctypes.c_wchar*128),
('wServicePackMajor', ctypes.c_ushort),
('wServicePackMinor', ctypes.c_ushort),
('wSuiteMask', ctypes.c_ushort),
('wProductType', ctypes.c_byte),
('wReserved', ctypes.c_byte)]
"""
Get's the OS major and minor versions. Returns a tuple of
(OS_MAJOR, OS_MINOR).
"""
os_version = OSVERSIONINFOEXW()
os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
if retcode != 0:
raise Exception("Failed to get OS version")
version_string = "Version:%d-%d; Build:%d; Platform:%d; CSD:%s; ServicePack:%d-%d; Suite:%d; ProductType:%d" % (
os_version.dwMajorVersion, os_version.dwMinorVersion,
os_version.dwBuildNumber,
os_version.dwPlatformId,
os_version.szCSDVersion,
os_version.wServicePackMajor, os_version.wServicePackMinor,
os_version.wSuiteMask,
os_version.wReserved
)
return version_string
def _create_bitmap(self, width, height):
self._data = (ctypes.c_byte * (4 * width * height))()
self._bitmap = ctypes.c_void_p()
self._format = PixelFormat32bppARGB
gdiplus.GdipCreateBitmapFromScan0(width, height, width * 4,
self._format, self._data, ctypes.byref(self._bitmap))
self._graphics = ctypes.c_void_p()
gdiplus.GdipGetImageGraphicsContext(self._bitmap,
ctypes.byref(self._graphics))
gdiplus.GdipSetPageUnit(self._graphics, UnitPixel)
self._dc = user32.GetDC(0)
gdi32.SelectObject(self._dc, self.font.hfont)
gdiplus.GdipSetTextRenderingHint(self._graphics,
TextRenderingHintAntiAliasGridFit)
self._brush = ctypes.c_void_p()
gdiplus.GdipCreateSolidFill(0xffffffff, ctypes.byref(self._brush))
self._matrix = ctypes.c_void_p()
gdiplus.GdipCreateMatrix(ctypes.byref(self._matrix))
self._flags = (DriverStringOptionsCmapLookup |
DriverStringOptionsRealizedAdvance)
self._rect = Rect(0, 0, width, height)
self._bitmap_height = height
def __init__(self, size):
self.size = size
self.array = (ctypes.c_byte * size)()
self.ptr = ctypes.cast(self.array, ctypes.c_void_p).value