Как читать с адреса указателя в 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])
Другие вопросы по тегам