Solution de l'étape 3

Ajoutez le code suivant au fichier qr.py

def applique_masque(x, y, b):
    m = 1 if (x + y) % 3 == 0 else 0
    return b ^ m

def placer_module_donnee(img, x, y, b):
    placer_module(img, x, y, couleur_module(applique_masque(x, y, b)))

def placer_octet_montant(img, octet, x, y):
    for i in range(8):
        dx = i % 2
        dy = i // 2
        placer_module_donnee(img, x + dx, y + dy, bit(octet, i))

def placer_octet_descendant(img, octet, x, y):
    for i in range(8):
        dx = i % 2
        dy = 3 - (i // 2)
        placer_module_donnee(img, x + dx, y + dy, bit(octet, i))

def placer_octet_montant_separe(img, octet, x, y):
    for i in range(8):
        dx = i % 2
        dy = i // 2 + i // 4
        placer_module_donnee(img, x + dx, y + dy, bit(octet, i))

def placer_octet_descendant_separe(img, octet, x, y):
    for i in range(8):
        dx = i % 2
        dy = 4 - (i // 2) - (i // 4)
        placer_module_donnee(img, x + dx, y + dy, bit(octet, i))

def placer_modules_donnees(img, octets):
    for i in range(3):
        placer_octet_montant(img, octets[i], 19, 17 - i * 4)
    for i in range(3):
        placer_octet_descendant(img, octets[3 + i], 17, 9 + i * 4)
    for i in range(3):
        placer_octet_montant(img, octets[6 + i], 15, 17 - i * 4)
    for i in range(3):
        placer_octet_descendant(img, octets[9 + i], 13, 9 + i * 4)
    for i in range(3):
        placer_octet_montant(img, octets[12 + i], 11, 17 - i * 4)
    placer_octet_montant_separe(img, octets[15], 11, 4)
    placer_octet_montant(img, octets[16], 11, 0)
    placer_octet_descendant(img, octets[17], 9, 0)
    placer_octet_descendant_separe(img, octets[18], 9, 4)
    for i in range(3):
        placer_octet_descendant(img, octets[19 + i], 9, 9 + i * 4)
    placer_octet_montant(img, octets[22], 7, 9)
    placer_octet_descendant(img, octets[23], 4, 9)
    placer_octet_montant(img, octets[24], 2, 9)
    placer_octet_descendant(img, octets[25], 0, 9)

Ajouter le code suivant au fichier encodeur.py

def encode_message(message):
    bits = 0b0100
    octets_message = message.encode('iso-8859-1')
    longueur = len(octets_message)
    if longueur > 17:
        raise ValueError('Le message est trop long')
    bits <<= 8
    bits ^= longueur

    for octet in octets_message:
        bits <<= 8
        bits ^= octet

    bits <<= 4

    for i in range(17 - longueur):
        bits <<= 8
        if i % 2 == 0:
            bits ^= 236
        else:
            bits ^= 17
    
    octets = []
    for i in range(19):
        octets.insert(0, bits & 255)
        bits >>= 8
    
    return octets