Kodowanie Manchester jest protokołem telekomunikacyjnym stosowanym w komunikacji radiowej, który gwarantuje przejścia bitów w regularnych odstępach czasu, dzięki czemu odbiornik może odzyskać częstotliwość zegara z samych danych. Podwaja przepływność, ale jest tani i prosty do wdrożenia. Jest szeroko stosowany przez amatorskich operatorów radiowych.
Pomysł jest bardzo prosty: na poziomie sprzętowym zegar i linie danych są po prostu XOR razem. W oprogramowaniu jest to przedstawiane jako przekształcanie strumienia wejściowego bitów w strumień wyjściowy o podwójnej szybkości, z każdym wejściowym „1” przetłumaczonym na „01” i każdym wejściowym „0” przetłumaczonym na „10”.
Jest to prosty problem, ale otwarty na wiele implementacji ze względu na swój charakter strumienia bitów. Oznacza to, że kodowanie jest koncepcyjnie procesem krok po kroku zamiast procesu bajt po bajcie. Wszyscy zgadzamy się co do endianowości, najmniej znaczące bity wejściowe stają się najmniej znaczącym bajtem wyjściowym.
Czas na golfa! Napisz funkcję, która, biorąc pod uwagę dowolną długość tablicy bajtów, zwraca tablicę danych zakodowanych w Manchester.
Wejścia i wyjścia należy traktować jako little-endian, najpierw najmniej znaczący bajt, a najmniej znaczący BIT pierwszy w strumieniu bitów.
Rysunek strumienia bitów 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
Przykłady :
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]
Zasady :
- Rozwiązanie wymaga jedynie algorytmu do konwersji danych wejściowych na dane wyjściowe.
- Pozyskiwanie danych wejściowych i wyjściowych NIE jest wymaganą częścią rozwiązania, ale może zostać uwzględnione. Zachęcamy do podania kodu testowego / drukowanego, jeśli nie jest uwzględniony w rozwiązaniu.
- Dane wejściowe to tablica 8-bitowych bajtów (cokolwiek to może znaczyć w wybranym języku), a NIE ciąg tekstowy. Możesz użyć ciągów jako formatu pamięci, jeśli jest to wygodne w twoim języku, ale znaki niedrukowalne (tj. 0xFF) muszą być obsługiwane. W razie potrzeby dane wejściowe mogą również trwać długo.
Pamięć wyjściowa musi być przydzielona przez twoją procedurę, a nie zapewniona.edycja: niepotrzebne wymagania- Dane wyjściowe to także tablica 8-bitowych bajtów i długość, jeśli to konieczne.
- Musi obsługiwać co najmniej 16 KB wejścia
- Wydajność nie może być zbyt okropna: <10 s dla 16 KB
- Najmniej znaczący bajt jako pierwszy w pamięci.
Wyzwanie w kanale bocznym :
- Zmierz się z odpowiedzią innego użytkownika, udowadniając, że Twój kod jest szybszy, bardziej wydajny pod względem pamięci lub tworzy mniejszy plik binarny!