Как читать с адреса указателя в Python?
Я хочу прочитать в скрипте Python количество байтов, начиная с определенного адреса. Например, я хочу прочитать 40000 байтов, начиная с 0x561124456.
Указатель дан из приложения C#. Я хочу использовать этот метод для передачи данных между приложением и сценарием. Я использовал TCP-сокет через localhost, но я хочу попробовать этот метод также.
Как я могу это сделать?
3 ответа
Если вы действительно хотите, наслаждайтесь:
import ctypes
g = (ctypes.c_char*40000).from_address(0x561124456)
Похоже на веселье сегфо. На обоих языках есть хорошие библиотеки соединений с сокетами (сокеты, RPC и т. Д.), Поэтому я бы еще раз подумал об этом, если это для какого-то большого проекта.
Как только я получил указатель на место в памяти от C, я обнаружил, что list(listSize * listDataType).from_address(memoryPointer)"создал внутреннюю копию памяти C. Если данных в памяти огромно, Python занимает много времени для создания объекта списка с использованием внутренней копии. Чтобы избежать внутреннего копирования, я использовал ctypelib.as_array в python:
import ctypes
import binascii
import numpy as np
myCfunslib.getData.restype = ctypes.c_void_p
#myCfunslib.getData.restype=ctypes.POINTER(ctypes.c_ubyte)#no need to cast
dataSize = 1092 * 1208
#call the c function to get the data memory pointer
cMemoryPointer = myCfunslib.getData();
newpnt = ctypes.cast(cMemoryPointer, ctypes.POINTER(ctypes.c_ubyte))
# and construct an array using this data
DataBytes = np.ctypeslib.as_array(newpnt, (dataSize,)) #no internal copy
print "the mid byte of the data in python side is ", DataBytes[dataSize/2]
Мне довелось поработать над аналогичной проблемой. Мой скрипт Python загружает библиотеку.so, чтобы получить адрес буфера изображения из C++.so. После того, как я получил адрес буфера, я должен быть в состоянии прочитать каждый байт в буфере. Я использовал "from_address" для создания объекта списка:
imageBytes = list(c_ubyte * dataSize).from_address(pointer)
Ниже приведены подробные сведения о том, как передать адрес памяти из C++ в pyth и как получить доступ к данным в памяти также на стороне python. В коде C++ frameprovider.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();
}
}
Мой питон:
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])