2013-04-12 15 views
7

Sto facendo un po 'di socket IO e usando un oggetto bytearray come buffer. Vorrei ricevere dati con un offset in questo buffer usando csock.recv_into come mostrato di seguito per evitare di creare oggetti stringa intermediari. Sfortunatamente, sembra che non sia possibile utilizzare bytearrays in questo modo, e il codice sottostante non funziona.utilizzando bytearray con socket.recv_into

buf = bytearray(b" " * toread) 
read = 0 
while(toread): 
    nbytes = csock.recv_into(buf[read:],toread) 
    toread -= nbytes 
    read += nbytes 

Così, invece io sto usando il codice qui sotto, che fa usare una stringa temporanea (e lavora) ...

buf = bytearray(b" " * toread) 
read = 0 
while(toread): 
    tmp = csock.recv(toread) 
    nbytes = len(tmp) 
    buf[read:] = tmp 
    toread -= nbytes 
    read += nbytes 

c'è un più elegante modo per farlo che doesn' t richiedono di copiare stringhe intermedie in giro?

+0

Qual è l'errore hai trovato? Quale versione di Python stai usando (esattamente)? http://bugs.python.org/issue7827 suggerisce che questo sia corretto a partire da Python 2.7.2. – nneonneo

+0

versione python è 2.7.3. E questo non è legato a quel bug ... csock.recv_into (buf) funziona bene per me. Ciò che non è possibile è usarlo in questo modo: csock.recv_into (buf [leggi:]) come allora l'oggetto buf originale non viene aggiornato. – cyann

risposta

18

Utilizzare un memoryview per avvolgere la bytearray:

buf = bytearray(toread) 
view = memoryview(buf) 
while toread: 
    nbytes = sock.recv_into(view, toread) 
    view = view[nbytes:] # slicing views is cheap 
    toread -= nbytes 
+0

Perfetto! Esattamente quello che stavo cercando, grazie. Non conoscevo le immagini della memoria ... Leggendole ora! – cyann

Problemi correlati