Mã hóa Manchester là một giao thức viễn thông được sử dụng trong thông tin vô tuyến đảm bảo chuyển đổi bit theo chu kỳ đều đặn để người nhận có thể khôi phục tốc độ xung nhịp từ chính dữ liệu. Nó tăng gấp đôi bitrate, nhưng rẻ và đơn giản để thực hiện. Nó được sử dụng rộng rãi bởi các nhà khai thác vô tuyến nghiệp dư.
Khái niệm này rất đơn giản: ở cấp độ phần cứng, đồng hồ và các dòng dữ liệu chỉ đơn giản là XOR với nhau. Trong phần mềm, điều này được mô tả là chuyển đổi một luồng bit đầu vào thành luồng đầu ra có tốc độ gấp đôi, với mỗi đầu vào '1' được dịch thành '01' và mỗi đầu vào '0' được dịch thành '10'.
Đây là một vấn đề dễ dàng, nhưng mở ra cho rất nhiều triển khai vì tính chất dòng bit của nó. Nghĩa là, mã hóa về mặt khái niệm là một quá trình từng bit thay vì một quá trình theo từng byte. Vì vậy, tất cả chúng ta đều đồng ý về tuổi thọ, các bit có trọng số thấp nhất của đầu vào trở thành byte ít quan trọng nhất của đầu ra.
Giờ chơi gôn! Viết một hàm, được cung cấp một mảng byte có độ dài tùy ý, trả về một mảng dữ liệu manchester được mã hóa.
Đầu vào và đầu ra nên được coi là đầu cuối nhỏ, byte đầu tiên ít quan trọng nhất và BIT ít quan trọng nhất trước tiên trong luồng bit.
Bản vẽ dòng 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
Ví dụ :
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]
Quy tắc :
- Giải pháp chỉ yêu cầu thuật toán để chuyển đổi đầu vào thành đầu ra.
- Có được đầu vào và đầu ra in KHÔNG phải là một phần bắt buộc của giải pháp, nhưng có thể được bao gồm. Bạn được khuyến khích cung cấp mã kiểm tra / in nếu không có trong giải pháp của bạn.
- Đầu vào là một mảng gồm các byte 8 bit (bất cứ điều gì có thể có nghĩa trong ngôn ngữ bạn chọn), KHÔNG phải là một chuỗi văn bản. Bạn có thể sử dụng các chuỗi làm định dạng lưu trữ nếu thuận tiện trong ngôn ngữ của bạn, nhưng phải hỗ trợ các ký tự không in được (ví dụ 0xFF). Đầu vào cũng có thể mất một chiều dài nếu cần thiết.
Bộ nhớ cho đầu ra phải được phân bổ theo thói quen của bạn, không được cung cấp.chỉnh sửa: yêu cầu không cần thiết- Đầu ra cũng là một mảng gồm 8 bit byte và độ dài nếu cần thiết.
- Phải hỗ trợ ít nhất 16KB đầu vào
- Hiệu suất không được quá kinh khủng: <10 giây cho 16KB
- Ít nhất là byte đáng kể đầu tiên trong bộ nhớ.
Thử thách kênh phụ :
- Thách thức câu trả lời của người dùng khác bằng cách chứng minh mã của bạn nhanh hơn, hiệu quả bộ nhớ hơn hoặc tạo ra một nhị phân nhỏ hơn!