ctypes And The WACAH Principle
Lawrence D’Oliveiro
lawrencedo99 at gmail.com
Wed Aug 10 18:26:23 EDT 2016
On Wednesday, August 10, 2016 at 10:13:53 PM UTC+12, eryk sun wrote:
> ctypes classes have from_buffer and from_buffer_copy methods that use
> the buffer protocol. For example, for a read-only buffer you can use
> from_buffer_copy:
>
> >>> b = bytes(b'1234')
> >>> a = (ctypes.c_char * 3).from_buffer_copy(b, 1)
> >>> a[:]
> b'234'
Can I avoid the copying? For example, in Qahirah <https://github.com/ldo/qahirah> the following method creates and fills in an ImageSurface from a stream of bytes in PNG format:
@classmethod
def create_from_png_bytes(celf, data) :
"creates an ImageSurface from a PNG-format data sequence. This can be" \
" of the bytes or bytearray types, or an array.array with \"B\" type code."
offset = 0
def read_data(_, data, length) :
nonlocal offset
if offset + length <= len(data) :
ct.memmove(data, baseadr + offset, length)
offset += length
status = CAIRO.STATUS_SUCCESS
else :
status = CAIRO.STATUS_READ_ERROR
#end if
return \
status
#end read_data
#begin create_from_png_bytes
if isinstance(data, bytes) or isinstance(data, bytearray) :
data = array.array("B", data)
elif not isinstance(data, array.array) or data.typecode != "B" :
raise TypeError("data is not bytes, bytearray or array of bytes")
#end if
baseadr = data.buffer_info()[0]
return \
celf.create_from_png_stream(read_data, None)
#end create_from_png_bytes
But it has to copy the bytes into an array.array object, then decode that. Is there a way it could access the bytes memory directly?
More information about the Python-list
mailing list