2017-05-04 4 views
1

Je veux analyser certaines données avec Python et scapy. Pour cela, je dois analyser des bits uniques. Mais au moment où j'ai pour les paquets UDP excample avec une charge utile comme:Python byte array to bit array

bytes = b'\x18\x00\x03\x61\xFF\xFF\x00\x05\x42\xFF\xFF\xFF\xFF' 

Est-il un moyen élégant pour convertir les octets afin que je puisse accéder à des bits uniques comme:

bytes_as_bits = convert(bytes) 
bit_at_index_42 = bytes_as_bits[42] 
+0

Alors .. quel sera peu '8' par exemple? Un MSB du second octet? Un LSB de celui-ci? –

+0

Avez-vous essayé quelque chose comme ''' .join (f '{byte: b}' pour byte en octets)'? – vaultah

Répondre

2

Cela fonctionne:

def access_bit(data, num): 
    base = int(num/8) 
    shift = num % 8 
    return (data[base] & (1<<shift)) >> shift 

Si vous souhaitez créer un tableau binaire, vous pouvez l'utiliser comme ceci:

[access_bit(data,i) for i in range(len(data)*8)] 
0

Hm, la est pas de bits de type builtin en python, mais vous pouvez faire quelque chose comme

>>> bin(int.from_bytes(b"hello world", byteorder="big")).strip('0b') 
'1101000011001010110110001101100011011110010000001110111011011110111001001101100011001' 
+0

Comment votre réponse gère-t-elle les tableaux de grands octets? – vaultah

+0

La charge utile ne semble pas être grande dans ce cas particulier. –