memoryview
的字段,因此可以轻松支持这一点,因此我始终可以将一个to and to to任何文件偏移。我所有的
memoryview
都是连续的。
现在,我有一个函数,它返回了一堆与图像文件中的所有图像数据相对应(与元数据相对),并且我想确定基础memoryview
对象的哪个范围,或等效地,图像文件,这些范围对应于图像。换句话说,我想从与“这是memoryview
的视图”相对应的memoryview
信息中提取。
在我看来,似乎必须具有内部足够的信息来计算其与之相对的基础对象中的开始和结束偏移。但是,我找不到可以帮助我访问此信息的方法。
那里有这样的方法吗?出于某种原因,这样的方法会成为一个不好或不可能的想法吗?是否有方便的替代方法可以让我这样做?没有一个完整的答案(因此,如果某人有洞察力或更好的解决方案,我打算接受该答案),但这是使用Cython的解决方法。能够在没有Cython的情况下这样做会很高兴。
bytes
usage:
memoryview
这里是
underlying_bytes[12:100]
:的解决方案
memoryview
memoryview
,功能
memoryview
提高from cpython.buffer cimport PyObject_GetBuffer, PyBuffer_Release, PyBUF_ANY_CONTIGUOUS, PyBUF_SIMPLE
import cython
@cython.binding(True)
def memoryview_slice(m: memoryview) -> slice:
'''Gets a slice object that corresponds to the given memoryview's view on the undelying.'''
cdef Py_buffer view_buffer, underlying_buffer
PyObject_GetBuffer(m, &view_buffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS)
try:
view_ptr = <const char *>view_buffer.buf
PyObject_GetBuffer(m.obj, &underlying_buffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS)
try:
underlying_ptr = <const char *>underlying_buffer.buf
if view_ptr < underlying_ptr:
raise RuntimeError("Weird: view_ptr < underlying_ptr")
start = view_ptr - underlying_ptr
return slice(start, start + len(m))
finally:
PyBuffer_Release(&underlying_buffer)
finally:
PyBuffer_Release(&view_buffer)