[RISOLTO]Byte con Python

di il
4 risposte

[RISOLTO]Byte con Python

Buongiorno a tutti,

mi sono avvicinato da poco a python per provare volevo scrivere un programma che cifrasse e decifrasse in modo molto semplice un file. L' algoritmo l'ho trovato su un bel sito di crittografia online.

il problema è che quando leggo un file con file_aperto.read(dimensione) python mi restituisce una stringa e quando vado a scrivere questa stringa sul file questa viene codificata automaticamente secondo il l'encoding di default. Questo già crea un problema quando semplicemente leggo un file con un encoding diverso da quello di base, ma questo sarebbe risolvibile scrivendo le opportune codifiche, ma quando leggo un file non di testo ad esempio un' immagine questo è decisamente peggio poichè non posso star li a controllare per ogni file l'encoding.

Avevo gia fatto questo programma in C tempo addietro e li il problema non si presentava in quanto un file aperto in modalità binaria viene letto byte per byte e riscritto esattamente con quei byte li.

esiste un metodo in python per leggere blocchi di byte e riceverli come valori esadecimali da scrivere al posto che codificati come stringhe?

non so se mi sono spiegato bene in caso avvisatemi.

grazie a tutti in anticipo

4 Risposte

  • Re: [RISOLTO]Byte con Python

    Ciao! In Python la funzione "read" restituisce delle stringhe, per cui per poter leggere un file byte per byte devi leggere 1 byte alla volta (tramite la "read(1)", che restituisce una stringa di 1 carattere) e poi dirgli di interpretarlo come un numero:
    
    with open(filename, 'rb') as f:
        buf = True
        while buf:
            buf = f.read(1) # leggo 1 byte
            b = ord(buf) # ora "b" è un intero che rappresenta il valore decimale del byte; es: 224
            h = hex(b) # ora "h" è una stringa contenente il valore esadecimale del byte; es: 0xE0
            print '%s --> %d' % (h, b) # stampa il byte sia in esadecimale che in decimale; es: 0xE0 --> 224
    
    In pratica l'operazione che ti serve per passare da stringa a "byte" è , mentre l'operazione inversa (quando poi dovrai scrivere sul file) è . Nota che chr() accetta come parametro un numero compreso fra 0 e 255 (ovvero 0x0 e 0xFF), perché qualsiasi numero al di fuori di questo intervallo non è rappresentabile con un singolo byte.
  • Re: [RISOLTO]Byte con Python

    Grazie mille,
    per merito della tua spiegazione e di alcuni test svolti su essa mi sono reso conto del mio errore. sono ancora legato al metodo di trattare i byte del c dove una variabile char contiene uno e un soltanto byte e quindi in quando vedo un carattere lo leggo immediatamente come 1 byte, questo però non è vero per i caratteri speciali come quelli accentati che sono composti da più di un byte per cui non leggevo l`intero carattere bensì solo parte di esso, questo mi causava dei problemi mentre cifravo il file ma si metteranno apposto autonomamente durante la decifratura.

    Ti ringrazio ancora per l'aiuto! ci avrei messo un bel po' di tempo prima di accorgermene se non mi avessi aiutato.
  • Re: [RISOLTO]Byte con Python

    Di niente
    Nota comunque che leggere un file 1 byte alla volta è molto costoso in termini di tempo, per cui potresti ottimizzare il programma andando a leggere il file per blocchi di byte:
    
    BLOCK_SIZE = 8*1024
    with open(filename, 'rb') as f:
        buf = True
        count = 0
        while buf:
            buf = f.read(BLOCK_SIZE)
            for c in buf:
                print hex(ord(c))
    
  • Re: [RISOLTO]Byte con Python

    È esattamente ciò che faccio ma il problema non era nella lettura del byte ma nella manipolazione byte per byte della stringa, ora che ho capito come agisce l'interprete diventa semplice capire come farlo.

    in pratica devo leggere blocchi di kilobyte ed inserirli in una lista di caratteri.
Devi accedere o registrarti per scrivere nel forum
4 risposte