Manchester kodlaması , radyo iletişiminde kullanılan ve bir alıcının saat hızını verilerin kendisinden kurtarabilmesi için düzenli aralıklarla bit geçişlerini garanti eden bir telekom protokolüdür. Bit hızını iki katına çıkarır, ancak uygulanması ucuz ve kolaydır. Amatör radyo operatörleri tarafından yaygın olarak kullanılmaktadır.
Kavram çok basit: donanım düzeyinde, saat ve veri hatları birlikte XORed. Yazılımda, bu, bir bit giriş akışını çift oranlı bir çıkış akışına dönüştürmek olarak tasvir edilir, her bir '1' girişi bir '01'e çevrilir ve her bir' 0 'girişi bir' 10'a çevrilir.
Bu kolay bir sorundur, ancak bit akımı doğası nedeniyle birçok uygulamaya açıktır. Yani, kodlama byte byte byte işlemi yerine kavramsal olarak bit-by-bit bir süreçtir. Bu yüzden hepimiz endianiteye katılıyoruz, girdinin en az önemli bitleri çıktının en az önemli baytı haline geliyor.
Golf zamanı! Rasgele uzunluktaki bayt dizisi verildiğinde, bu veri manchester'ının kodlanmış bir dizisini döndüren bir işlev yazın.
Girdi ve çıktı, bit akışında küçük endian, önce en az önemli bayt ve önce en az anlamlı BIT olarak düşünülmelidir.
ASCII bit akımı çizimi :
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
Örnekler :
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]
Kurallar :
- Çözüm yalnızca girdiyi çıktıya dönüştürmek için algoritma gerektirir.
- Giriş ve baskı çıktısının alınması, çözümün gerekli bir parçası DEĞİLDİR, ancak dahil edilebilir. Çözümünüze dahil edilmemişse, test / yazdırma kodunuzu girmeniz önerilir.
- Girdi, bir metin dizesi DEĞİL, 8 bit baytlık bir dizidir (dilinizde ne anlama gelirse gelsin). Dizeleri dilinize uygunsa depolama biçimi olarak kullanabilirsiniz, ancak yazdırılamayan karakterler (yani 0xFF) desteklenmelidir. Gerekirse giriş de uzun sürebilir.
Çıktı için bellek, sağlanmayan rutininiz tarafından ayrılmalıdır.düzenleme: gereksiz gereksinim- Çıktı ayrıca 8 bit baytlık bir dizidir ve gerekirse bir uzunluktur.
- En az 16KB girişi desteklemelidir
- Performans çok korkunç olmamalı: 16KB için <10s
- Hafızada ilk olarak en az önemli bayt.
Yan kanal zorluğu :
- Kodunuzun daha hızlı, bellekte daha verimli olduğunu veya daha küçük bir ikili veri ürettiğini kanıtlayarak başka bir kullanıcının yanıtına meydan okuyun!