Манчестерское кодирование - это телекоммуникационный протокол, используемый в радиосвязи, который гарантирует битовые переходы с регулярным интервалом, чтобы приемник мог восстановить тактовую частоту из самих данных. Он удваивает битрейт, но дешев и прост в реализации. Широко используется радиолюбителями.
Концепция очень проста: на аппаратном уровне часы и линии данных просто объединяются в XOR. В программном обеспечении это изображается как преобразование входного потока битов в выходной поток с двойной скоростью, причем каждый вход «1» транслируется в «01», а каждый вход «0» транслируется в «10».
Это простая проблема, но она открыта для многих реализаций из-за своей природы потока битов. То есть кодирование концептуально является побитовым процессом, а не побитовым процессом. Таким образом, мы все согласны с порядком байтов, младшие значащие биты входных данных становятся наименее значимыми байтами выходных данных.
Время игры в гольф! Напишите функцию, которая, учитывая массив байтов произвольной длины, возвращает массив этих манчестерских данных.
Ввод и вывод должны рассматриваться как младшие байты, младший значащий байт первым и младший значащий бит в битовом потоке.
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 КБ ввода
- Производительность не должна быть слишком ужасной: <10 с для 16 КБ
- Наименее значимый байт первым в памяти.
Задача побочного канала :
- Испытайте ответ другого пользователя, доказав, что ваш код быстрее, эффективнее использует память или создает меньший двоичный файл!