使用 `ctypes.string_at` 检查 `memoryview` 对象的内存

如何解决使用 `ctypes.string_at` 检查 `memoryview` 对象的内存

在 Python 中,memoryview 获取 bytesbytearrays 或任何支持缓冲区协议的内部记忆的查看器。如果我使用 ctypes.string_at 获取 memoryview 对象显示的内存地址处的值,则无法获取有关原始对象的任何信息,例如(交互式控制台):

>>> from ctypes import string_at
>>> from sys import getsizeof
>>> a = b'abc'
>>> b = memoryview(a)
>>> b
<memory at 0x7fb8e99c8408>
>>> string_at(0x7fb8e99c8408,getsizeof(a))
b'\x02\x00\x00\x00\x00\x00\x00\x00@\x0e\x8a\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00H\x10\x96\xe9\xb8\x7f\x00\x00\xff\xff\xff\xff'

结果没有显示b'abc'的证据。那么内存0x7fb8e99c8408memoryview对象的对象字符串中究竟是什么意思呢?我们可以直接验证内存来证明memoryview确实反映了内部内存吗?

解决方法

这是内存中 import heapq def mergeArys(srtd_arys): heap = [] srtd_iters = [iter(x) for x in srtd_arys] # put the first element from each srtd array onto the heap for idx,it in enumerate(srtd_iters): elem = next(it,None) if elem: heapq.heappush(heap,(elem,idx)) res = [] # the number of tims that the current number has been seen times_seen = 0 # the lowest number from the heap - currently checking if the first numbers in all sub-lists are equal to this lowest = heap[0][0] if heap else None # collect results in nlogK time while heap: elem,ary = heap[0] unbench_all = True if lowest != elem or ary != times_seen: if lowest == elem: heapq.heappop(heap) it = srtd_iters[ary] nxt = next(it,None) if nxt: heapq.heappush(heap,(nxt,ary)) else: heapq.heappop(heap) times_seen += 1 if times_seen == len(srtd_arys): res.append(elem) else: unbench_all = False if unbench_all: for unbenched in range(times_seen): unbenched_it = srtd_iters[unbenched] nxt = next(unbenched_it,unbenched)) times_seen = 0 if heap: lowest = heap[0][0] return res if __name__ == '__main__': a1 = [[1,3,5,7],[1,1,4,7,9]] a2 = [[1,1],2,3]] for arys in [a1,a2]: print(mergeArys(arys)) 对象的地址,而不是字符串对象本身(假设 CPython 实现)。要查看字符串字节,您需要 def mergeArys(srtd_arys): heap = [] srtd_iters = [iter(x) for x in srtd_arys] # put the first element from each srtd array onto the heap for idx,idx)) res = [] # collect results in nlogK time while heap: elem,ary = heap[0] lowest = elem keep_elem = True for i in range(len(srtd_arys)): elem,ary = heap[0] if lowest != elem or ary != i: if ary != i: heapq.heappop(heap) it = srtd_iters[ary] nxt = next(it,None) if nxt: heapq.heappush(heap,ary)) keep_elem = False i -= 1 break heapq.heappop(heap) if keep_elem: res.append(elem) for unbenched in range(i+1): unbenched_it = srtd_iters[unbenched] nxt = next(unbenched_it,None) if nxt: heapq.heappush(heap,unbenched)) if len(heap) < len(srtd_arys): heap = [] return res memoryview:

id(s)

如果您对输出感到好奇,可以阅读有关 Python here 中字符串对象表示的更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?