Besoin d'aide pour comprendre la bibliothèque Mirf, pour des nRF24L01

Bonjour
j'ai pris sur internet un code pour commander des moteurs avec des nRF24L01, mais je ne comprends pas une partie du code. Si quelqu'un peut m'expliqué juste les parties en rouge.

PARTIE EMMETEUR

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int calX;
int calY;
#define joystickPin1 0  //analog 0
#define joystickPin2 1  //analog 1

void setup(){
  Serial.begin(9600); 

  Mirf.cePin = 9; // CE sur D9, 
  Mirf.csnPin = 10; // CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 0; // On va utiliser le canal 0 pour communiquer (128 canaux disponible, de 0 à  127)
  Mirf.payload = 4; //  ici il faut déclarer la taille du "payload" soit du message qu'on va transmettre, au max 32 octets
  Mirf.config(); // Configure le module radio avec les valeurs de Mirf.channel et Mirf.payload. Active la partie réception du module et vide la mémoire tampon de réception.

  Mirf.setTADDR((byte *)"nrf02"); // Le 1er module va envoyer ses info au 2eme module
  Mirf.setRADDR((byte *)"nrf01"); // On définit ici l'adresse du 1er module

  Serial.println("Le client est pret..."); 
  calX = analogRead(joystickPin1); //valeur du joystick X dans le setup
  calY = analogRead(joystickPin2); //valeur du joystick Y dans le setup
}

void loop(){
  
  int numero1 = analogRead(joystickPin1) - calX ; //calibrage du joystick X
  int numero2 = analogRead(joystickPin2) - calY; //calibrage du joystick Y

[color=red]  // conversion dans un tableau de bytes (c 'est cette partie que je ne comprends pas)
  byte data[Mirf.payload]; 

  data[0] = (byte )((numero1 >> 8) & 0xff);
  data[1] = (byte )(numero1 & 0xff);
  data[2] = (byte )((numero2 >> 8) & 0xff);
  data[3] = (byte )(numero2 & 0xff);

  Mirf.send((byte *)&data); // On envoi les données (jusqu'à ici) [/color]

  while(Mirf.isSending());

J'ai précisé quelle partie je ne comprenais pas, pareil pour la partie récepteur:

PARTIE RECEPTEUR:

 if(!Mirf.isSending() && Mirf.dataReady())
  { // Si un message a été recu et qu'un autre n'est pas en cours d'emission
    
[color=red]  Mirf.getData(data); // on récupére le message 
  
  // la suite de 4 bytes est convertie en 2 int ( c'est cette partie que je ne comprends pas)  
  numero1 = ((long )data[0]) << 8;
  numero1 |= data[1];
  numero2 = ((long )data[2]) << 8;
  numero2 |= data[3];[/color]
    //(jusqu'à ici)

La partie que tu comprend pas, que ce soit à l'émission ou a la réception, c'est de la manipulation de bit. Plus précisément du décalage à gauche et à droite. Un peu de recherche sur google et tu trouvera des explication précise.

Le tuto d'eskimon en parle aussi.

Sinon, les nrf24 transmettent un octet à la fois, (un octet c'est 8 bits). Les variables "int" en C/C++ sous IDE Arduino pèse 2 octets (soit 16 bits).

Comme le nrf24 ne peux transmettre un seul octet à la fois, il faut "découper" le "int" en deux puis le ranger dans un tableau, ici nommé "data" qui est un tableau d'octet (que le nrf peut transmettre).

A la réception, c'est pareil, c'est octet par octet. Donc il faut recevoir les 2 morceaux de ton "int" en les rangeant dans un tableau, et ensuite on recolle les morceaux pour reconstituer un "int" d'un seul morceau et exploitable par le programme