% 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
C’est aussi la façon dont l’affiche python
>>> data = bytearray([97,98,99])
>>> data
bytearray(b"abc")
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")
Python affiche \x
et le code hexa:
>>> data = bytearray([7, 69, 76, 70])
>>> data
bytearray(b'\x07ELF')
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.