Ci sono due possibili modi per restituire il bit i-esimo di un byte. Il "primo bit" potrebbe riferirsi al bit di ordine elevato o potrebbe riferirsi al bit di ordine inferiore.
Ecco una funzione che accetta una stringa e un indice come parametri e restituisce il valore del bit in quella posizione. Come scritto, tratta il bit di ordine basso come il primo bit. Se si desidera innanzitutto il bit di ordine superiore, è sufficiente decommentare la riga indicata.
def bit_from_string(string, index):
i, j = divmod(index, 8)
# Uncomment this if you want the high-order bit first
# j = 8 - j
if ord(string[i]) & (1 << j):
return 1
else:
return 0
L'indicizzazione inizia da 0. Se si desidera che l'indicizzazione per iniziare a 1, è possibile regolare indice in funzione prima di chiamare divmod
.
Esempio Utilizzo:
>>> for i in range(8):
>>> print i, bit_from_string('\x04', i)
0 0
1 0
2 1
3 0
4 0
5 0
6 0
7 0
Ora, per come funziona:
Una stringa è composto di byte di 8 bit, quindi prima usiamo divmod() per rompere l'indice in a parti:
i
: l'indice del byte corretto all'interno della stringa
j
: l'indice del bit corretta w ntro che byte
Usiamo la funzione ord()
per convertire il carattere string[i]
in un tipo intero. Quindi, (1 << j)
calcola il valore del bit j-th spostando a sinistra 1 per j
. Infine, usiamo bit per bit e per testare se quel bit è impostato. In tal caso, restituire 1, altrimenti restituire 0.
fonte
2010-04-05 03:52:45
Testato questo (btw il byte è little endian) e ord ('\ x04') restituisce 4 che dovrebbe restituire la stringa di bit '0000100' usando il tuo codice ottengo '000100000' – David
oops volevo dire ottenere '00100000' con il tuo codice – David
Dà prima i bit più bassi (che è naturale, dato che fornisce anche i byte bassi). Ma se vuoi l'altro ordine, puoi cambiare 'xrange (8)' in 'invertito (xrange (8))'. –