Domanda

ho creato un oggetto di buffer in pitone in questo modo:

f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))

Ora sto passando byte_stream come parametro a una funzione C, attraverso SWIG. Ho un typemap per la conversione dei dati che assomiglia a questo:

%typemap(in) unsigned char * byte_stream {
    PyObject *buf = $input;
    //some code to read the contents of buf
}

Ho provato un paio di cose diverse bug non può raggiungere il contenuto / valore effettivo della mia byte_stream. Come faccio a convertire o accedere al contenuto della mia byte_stream utilizzando l'API C? Ci sono molti metodi diversi per la conversione di un dato C in un buffer ma nessuno che posso trovare per andare il contrario. Ho provato a guardare questo oggetto in GCB ma né esso, oppure i valori punta a contenere i miei dati.

(sto usando tamponi perché voglio evitare il sovraccarico di convertire i dati in una stringa durante la lettura dal file) Sto usando Python 2.6 su Linux.

- Grazie Pavel

È stato utile?

Soluzione

  

sto usando tamponi perché voglio   evitare il sovraccarico di conversione del   i dati in una stringa durante la lettura da   il file

Non sei evitando tutto ciò. La stringa è già costruito con il metodo read(). Chiamando buffer() solo costruisce un oggetto ulteriore buffer che punta a quella stringa.

Come per arrivare alla memoria indicato dall'oggetto tampone, provare PyObject_AsReadBuffer(). Vedi anche http://docs.python.org/c-api/objbuffer.html .

Altri suggerimenti

Non appena si utilizza il metodo read sul vostro oggetto file, i dati verranno convertiti in un oggetto str; chiamando il metodo buffer non converte in un flusso di qualsiasi tipo. Se si vuole evitare il sovraccarico di creazione dell'oggetto stringa, si può semplicemente passare l'oggetto file per il codice C e quindi utilizzarlo tramite C sua API .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top