Le codage Manchester est un protocole de télécommunications utilisé dans les communications radio qui garantit des transitions de bits à un intervalle régulier afin qu'un récepteur puisse récupérer la fréquence d'horloge à partir des données elles-mêmes. Il double le débit binaire, mais est bon marché et simple à mettre en œuvre. Il est largement utilisé par les opérateurs de radio amateur.
Le concept est très simple: au niveau matériel, l'horloge et les lignes de données sont simplement XOR ensemble. Dans le logiciel, cela est décrit comme convertissant un flux d'entrée de bits en un flux de sortie à double débit, chaque entrée «1» étant traduite en «01» et chaque entrée «0» traduite en «10».
C'est un problème facile, mais ouvert à de nombreuses implémentations en raison de sa nature bitstream. Autrement dit, le codage est conceptuellement un processus bit par bit au lieu d'un processus octet par octet. Nous sommes donc tous d'accord sur l'endianité, les bits les moins significatifs de l'entrée deviennent l'octet le moins significatif de la sortie.
Le temps du golf! Écrivez une fonction qui, étant donné un tableau d'octets de longueur arbitraire, retourne un tableau de ce gestionnaire de données codé.
L'entrée et la sortie doivent être considérées comme peu endiennes, l'octet le moins significatif en premier et le BIT le moins significatif en premier dans le flux binaire.
Dessin de flux binaire ASCII :
bit # 5 4 3 2 1 0 5 4 3 2 1 0
IN ------- 1 0 1 0 1 1 ---> [manchester encoder] --- 01 10 01 10 01 01 ----> OUT
Exemples :
Example 1 (hex):
LSB MSB <-- least sig BYTE first
IN : [0x10, 0x02]
OUT: [0xAA, 0xA9, 0xA6, 0xAA]
Example 1 (binary):
msb lsb msb lsb <-- translated hex, so msb first
BIN: [00010000, 00000010] <-- least sig NIBBLE...
BIN: [10101010, 10101001, 10100110, 10101010] <-- becomes least sig BYTE
LSB MSB
Example 2
IN : [0xFF, 0x00, 0xAA, 0x55]
OUT: [0x55, 0x55, 0xAA, 0xAA, 0x66, 0x66, 0x99, 0x99]
Example 3
IN : [0x12, 0x34, 0x56, 0x78, 0x90]
OUT: [0xA6, 0xA9, 0x9A, 0xA5, 0x96, 0x99, 0x6A, 0x95, 0xAA, 0x69]
Example 4
IN : [0x01, 0x02, 0x03, 0xF1, 0xF2, 0xF3]
OUT: [0xA9, 0xAA, 0xA6, 0xAA, 0xA5, 0xAA, 0xA9, 0x55, 0xA6, 0x55, 0xA5, 0x55]
Règles :
- La solution ne nécessite qu'un algorithme pour convertir l'entrée en sortie.
- L'acquisition d'entrée et de sortie d'impression NE fait PAS partie de la solution, mais peut être incluse. Nous vous encourageons à fournir votre code de test / d'impression s'il n'est pas inclus dans votre solution.
- L'entrée est un tableau d'octets de 8 bits (quoi que cela puisse signifier dans la langue de votre choix), PAS une chaîne de texte. Vous pouvez utiliser des chaînes comme format de stockage si cela vous convient dans votre langue, mais les caractères non imprimables (c'est-à-dire 0xFF) doivent être pris en charge. L'entrée peut également prendre une longueur si nécessaire.
La mémoire de sortie doit être allouée par votre routine, non fournie.modifier: exigence inutile- La sortie est également un tableau d'octets de 8 bits et une longueur si nécessaire.
- Doit prendre en charge au moins 16 Ko d'entrée
- Les performances ne doivent pas être trop horribles: <10s pour 16 Ko
- Octet le moins significatif en premier en mémoire.
Défi du canal latéral :
- Défiez la réponse d'un autre utilisateur en prouvant que votre code est plus rapide, plus efficace en mémoire ou produit un binaire plus petit!