[Python] Maneggiare i byte

michele a nectarine.it michele a nectarine.it
Mer 24 Set 2008 19:22:10 CEST


2008/9/24 Enrico Franchi <enrico.franchi a gmail.com>:
>> Supponiamo di leggere un file binario:
>>
>> fd = open('/tmp/foo','rb')
>> cont = fd.read()
>> fd.close()
>>
>> Ora, le mie domande sono: come si possono estrarre 5 byte da quella
>> stringa evitando di utilizzare file.seek() e file.read()?
>> Nel senso: ho a disposizione un tipo stringa che contiene dei byte
>> di dati.
>>   - Come posso ottenere delle 'fette' di dati?
>>   - Come posso ottenere la lunghezza in byte di questi dati?
>
> Quello che ti dicevo riguardo al leggere un manuale. Le stringhe sono
> sliceabili.
> Sono proprio fatte apposta per prenderne delle fette.
>
> s[2:7]

Conoscevo dello slicing delle stringhe in stile MATLAB, ma quello che  
non capisco è se c'è una corrispondenza 1:1 tra s[i] e un byte del mio  
file.
Se sì, a questo punto posso maneggiare senza problemi ogni byte del  
mio file, in quanto ogni byte è un carattere della mia stringa.
O sono costretto ad usare il modulo struct di cui parlava Giorgio Zoppi?

>
> Io *non* erediterei da lista in generale. In particolare lista non è
> la classe giusta di partenza.
> Una lista ha un fottio di cose più di un BitSet, e sono cose che
> ovviamente paghi in spazio e in tempo.
> In secondo luogo io *non* userei l'ereditarietà, ma la composizione.

Vero, errore mio. Al posto dell'ereditarietà è meglio usare la  
composizione, hai ragione.

> Per rimanere in pure-python io userei probabilmente composizione con
> array.
> Ovviamente occupa molto più spazio di un bitset fatto di bit (ma
> dovrebbe anche essere più veloce).

Ok, un array di tipi bool True/False.


> Questo se vuoi l'oggetto a livello didattico per vedere come si fa a
> farlo. Se vuoi un oggetto che manipoli i bit io lo scriverei
> appoggiandomi a C, wrappando con ctypes oppure usando direttamente le
> API C di Python. IMHO usare ctypes rende il tutto sbaloriditivamente
> banale. In due ore lo hai fatto e finito, con test allegati. Con le
> API C di Python, beh, prima devi imparare un po' come funzionano. Non
> che sia veramente complesso, ma forse sempre più rognoso di quello che
> vuoi fare.

Esatto, è molto piu' rognoso e non vorrei addentrarmi troppo nei dettagli.

Vi ringrazio per l'aiuto.

    Michele



Maggiori informazioni sulla lista Python