如何从Python中的指针地址读取?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (2173)

我想用Python脚本读取从特定地址开始的大量字节。例如,我想读取从0x561124456开始的40000字节。

指针是从C#app发出的。 我想使用此方法在应用程序和脚本之间传递数据。 我通过localhost使用了TCP套接字,但我也想尝试这种方法。

我怎样才能做到这一点?

提问于
用户回答回答于

我的python脚本加载了so库,以便从c+.so获得图像缓冲区地址。获得缓冲区地址后,需要能够读取缓冲区中的每个字节。我用“从_“地址”以创建列表对象:

imageBytes = list(c_ubyte * dataSize).from_address(pointer)

下面将详细说明如何获取从c+传递给Pyth的内存地址,以及如何访问python端的内存数据。在c+代码framework Provider.cpp中:

dataPackPtr = new DataPack(); 

DataPack * getFrame(){
    uint32_t width = 1920;
    uint32_t height = 1208;
    const size_t buffersize = width * height * 4;//rgba, each color is one byte
    unsigned char* rgbaImage = (unsigned char * )malloc(buffersize);
    memset(rgbaImage, 0, buffersize); // set all the buffer data to 0.
    dataPackPtr->width = width;
    dataPackPtr->height = height;
    dataPackPtr->buffersize = buffersize;
    dataPackPtr->bufferPtr = rgbaImage;
    return dataPackPtr;
}

extern "C" {
    DataPack* getFrame_wrapper(){
        return getFrame();
    }
}

My python:

import ctypes
import binascii
lib = ctypes.cdll.LoadLibrary('/libpath/frameprovider.so')
print vars(lib)

class dataPack(ctypes.Structure):
    _fields_ = [("width",ctypes.c_int),
                ("height",ctypes.c_int),
                ("buffersize",ctypes.c_int),
                ("bufferAddress", ctypes.c_void_p)]

lib.getFrame_wrapper.restype = ctypes.POINTER(dataPack)
data = lib.getFrame_wrapper()
print "in python the w= ", data.contents.width, "h=",data.contents.height
print "the buffersize=",data.contents.height
imageBytes = list(
(data.contents.buffersize * ctypes.c_ubyte).
 from_address(data.contents.bufferAddress))        

print "the len of imageBytes are ", len(imageBytes)
print imageBytes[data.contents.buffersize -1] #print the last byte in the buffer
print "in python, the hex value of element 12 is ", hex(imageBytes[12])
用户回答回答于

可以试试:

import ctypes
g = (ctypes.c_char*40000).from_address(0x561124456)

两种语言(套接字、RPC等)上都有很好的套接字连接库,所以如果这是针对一些大型项目,我会再考虑一次。

扫码关注云+社区

领取腾讯云代金券