Pengkodean Manchester adalah protokol telekomunikasi yang digunakan dalam komunikasi radio yang menjamin transisi bit secara berkala sehingga penerima dapat memulihkan laju jam dari data itu sendiri. Ini menggandakan bitrate, tetapi murah dan mudah diimplementasikan. Ini banyak digunakan oleh operator radio amatir.
Konsepnya sangat sederhana: pada tingkat perangkat keras, jam dan jalur data secara sederhana disatukan. Dalam perangkat lunak, ini digambarkan sebagai mengubah aliran input bit ke aliran output laju ganda, dengan setiap input '1' diterjemahkan ke '01' dan setiap input '0' diterjemahkan ke '10'.
Ini adalah masalah yang mudah, tetapi terbuka untuk banyak implementasi karena sifat bitstreamnya. Artinya, pengkodean secara konseptual adalah proses bit-by-bit, bukan proses byte-by-byte. Jadi kita semua sepakat pada endianness, bit input paling tidak signifikan menjadi byte paling signifikan dari output.
Waktu bermain golf! Tulis fungsi yang, diberikan array panjang byte yang sewenang-wenang, mengembalikan array dari manchester data yang disandikan.
Input dan output harus dianggap little-endian, byte paling signifikan pertama, dan BIT paling signifikan pertama dalam bit stream.
Gambar bitstream 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
Contoh :
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]
Aturan :
- Solusi hanya membutuhkan algoritma untuk mengkonversi input ke output.
- Mendapatkan input dan output cetak BUKAN merupakan bagian yang diperlukan dari solusi, tetapi dapat dimasukkan Anda disarankan untuk memberikan kode uji / cetak Anda jika tidak termasuk dalam solusi Anda.
- Input adalah larik byte 8-bit (apa pun artinya dalam bahasa pilihan Anda), BUKAN string teks. Anda dapat menggunakan string sebagai format penyimpanan jika sesuai dengan bahasa Anda, tetapi karakter yang tidak dapat dicetak (mis. 0xFF) harus didukung. Input juga bisa memakan waktu lama jika perlu.
Memori untuk keluaran harus dialokasikan oleh rutinitas Anda, bukan disediakan.sunting: persyaratan yang tidak perlu- Output juga merupakan array byte 8-bit, dan panjang jika perlu.
- Harus mendukung setidaknya 16KB input
- Kinerja tidak boleh terlalu mengerikan: <10s untuk 16KB
- Byte terkecil-signifikan pertama dalam memori.
Tantangan saluran samping :
- Tantang jawaban pengguna lain dengan membuktikan kode Anda lebih cepat, lebih hemat memori, atau menghasilkan biner yang lebih kecil!