我可以从内存视图中偏移到基础对象吗? (为什么不呢?)还有其他选择吗? 我为二进制文件格式实施解析器。 MemoryView似乎是一个几乎是完美的解决方案:解析器类将数据保存在字节对象中并传递切片的内存Vie ...

问题描述 投票:0回答:1
对象中,并将切成薄片的数据传递给解析子结构的代码。有时,这些子结构包含相对于整个文件的偏移;基础对象是

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)

python buffer memoryview
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.