% Programmation avec Python (chapitre 14) % Dimitri Merejkowsky
\center \huge Parlons de binaire
Ces paquets de 8 ne veulent rien dire en eux-mêmes. Ils n’ont de sens que dans le cadre d’une convention.
Détaillons.
On peut interpréter bits et octets comme des nombres
2: 01 5 101 1*4 + 0*2 + 1*1
10: 0..9 305 305 3*10 + 0*10 + 5*1
16: 0..9..F 3490 DA2 (d=13)*256 + (a=10)*16 + 2*1
>>> 0b101
5
>>> 0xda2
3490
>>> bin(5)
"0b101"
>>> hex(3490)
"0xda2"
Avec bytearray
par exemple:
data = bytearray(
[0b1100001,
0b1100010,
0b1100011,
0b1100100]
)
# equivalent:
data = bytearray([97,98,99])
# equivalent aussi:
data = bytearray([0x61, 0x62, 0x63]
On peut interpréter des octets comme du texte - c’est la table ASCII
Avec ord
et chr
>>> ord('a')
97
>>> chr(98)
'b'
Python utilise ASCII pour afficher les bytearrays si les caractères sont “imprimables”
>>> data = bytearray([97,98,99])
>>> data
bytearray(b"abc")
Et \x
et le code hexa sinon:
>>> data = bytearray([7, 69, 76, 70])
>>> data
bytearray(b'\x07ELF')
La variable b"abc"
est une “chaîne de bits”, de même que "abc"
est une “chaîne de caractères”.
Python apelle ces types bytes
et str
:
>>> type("abc")
str
>>> type(b"abc")
bytes
Notez bien que ce qu’affiche Python n’est qu’une interpétation du tableau de bits.
De la même manière qu’on ne peut pas un caractère dans une string, on ne peut
pas modifier un bit - ou un octet dans un bytes
.
>>> a = "foo"
>>> a[0] = "f"
TypeError: 'str' object does not support item assignment
>>> b = b"foo"
>>> b[0] = 1
TypeError: 'bytes' object does not support item assignment
Par contre on peut modifier un bytearray
>>> b = bytearray(b"foo")
>>> b[0] = 95
>>> b
bytearray("_oo")
Pas de caractères accentuès dans ASCII. Du coup, on a d’autres conventions qu’on appelle “encodage”.
# latin-1: utilisé sur certains vieux sites
# - souvent européens
>>> bytearray([0b11101001]).decode('latin-1')
'é'
# cp850: dans l'invite de commande Windows
>>> bytearray([0b11101001]).decode('cp850')
'Ú'
Mais ça, c'était avant. Avant UTF-8, un encodage qui a mis tout le monde d’accord.