맨체스터 코딩 은 무선 통신에 사용되는 통신 프로토콜로, 수신기는 데이터 자체에서 클럭 속도를 복구 할 수 있도록 일정한 간격으로 비트 전환을 보장합니다. 비트 전송률을 두 배로 늘리지 만 구현하기가 저렴하고 간단합니다. 아마추어 무선 통신 사업자가 널리 사용합니다.
개념은 매우 간단합니다. 하드웨어 수준에서 클럭과 데이터 라인은 단순히 XOR됩니다. 소프트웨어에서 이것은 비트의 입력 스트림을 이중 속도 출력 스트림으로 변환하는 것으로 묘사되며, 각 입력 '1'은 '01'로 변환되고 각 입력 '0'은 '10'으로 변환됩니다.
이것은 쉬운 문제이지만 비트 스트림 특성으로 인해 많은 구현에 개방적입니다. 즉, 인코딩은 개념적으로 바이트 단위 프로세스 대신 비트 단위 프로세스입니다. 따라서 우리 모두 엔디안에 동의합니다. 입력의 최하위 비트가 출력의 최하위 바이트가됩니다.
골프 시간! 임의의 길이의 바이트 배열이 주어진 경우 해당 데이터의 맨체스터 인코딩 된 배열을 반환하는 함수를 작성하십시오.
입력 및 출력은 비트 스트림에서 리틀 엔디안, 최하위 바이트 우선 및 최하위 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 비트 바이트의 배열이며 필요한 경우 길이입니다.
- 16KB 이상의 입력을 지원해야합니다
- 16KB의 경우 <10s
- 메모리에서 최하위 바이트.
부 채널 챌린지 :
- 코드가 더 빠르고, 메모리 효율적이거나, 더 작은 바이너리를 생성하여 다른 사용자의 답변에 도전하십시오!