Кодування в Манчестері - це телекомунікаційний протокол, який використовується в радіозв'язку, який гарантує перехід бітів через регулярний інтервал, щоб приймач міг відновлювати тактову частоту з самих даних. Він подвоює бітрейт, але дешевий і простий у виконанні. Він широко використовується радіооператорами-любителями.
Концепція дуже проста: на апаратному рівні лінії та годинник та дані просто XORed разом. У програмному забезпеченні це зображено як перетворення вхідного потоку бітів у вихідний потік з двома швидкістю, при цьому кожен вхід '1' переводиться на '01', а кожен вхід '0' перекладається на '10'.
Це проста проблема, але відкрита для багатьох реалізацій через її біткоїнний характер. Тобто кодування є концептуально процесом біт-біт замість процесу байт-байт. Таким чином, ми всі погоджуємося на витривалість, найменш значущі біти вхідних даних стають найменш значущим байтом виводу.
Час гольфу! Напишіть функцію, яка, задаючи масив байтів довільної довжини, повертає масив цих даних, закодованих manchester.
Введення та виведення слід вважати малоеквієнтним, найменш значущим байтом першим і найменш значущим BIT спочатку в потоці бітів.
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
Приклади :
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]
Правила :
- Для рішення потрібен лише алгоритм для перетворення вводу у вихід.
- Придбання вводу та виводу друку НЕ є обов'язковою частиною рішення, але може бути включено. Вам рекомендується надати код тесту / друку, якщо він не включений у ваше рішення.
- Введення - це масив 8-бітових байтів (що б це не означало з обраної вами мови), а не текстовий рядок. Ви можете використовувати рядки як формат зберігання, якщо це зручно для вашої мови, але символи, що не друкуються (тобто 0xFF), повинні підтримуватися. При необхідності введення може також тривати довжину.
Пам'ять для виводу повинна бути розподілена вашим розпорядком, а не надана.редагувати: зайва вимога- Вихід - це також масив 8-бітових байтів і довжина, якщо це необхідно.
- Повинна підтримувати принаймні 16 КБ
- Продуктивність не повинна бути занадто жахливою: <10s за 16KB
- Найменш значущий байт перший в пам'яті.
Виклик бічних каналів :
- Киньте виклик відповіді іншого користувача, довівши свій код швидше, ефективніше пам’яті або створити менший двійковий файл!