Die Manchester-Codierung ist ein Telekommunikationsprotokoll, das in der Funkkommunikation verwendet wird und in regelmäßigen Abständen Bitübergänge garantiert, damit ein Empfänger die Taktrate aus den Daten selbst wiederherstellen kann. Es verdoppelt die Bitrate, ist aber billig und einfach zu implementieren. Es wird häufig von Amateurfunkern eingesetzt.
Das Konzept ist sehr einfach: Auf Hardware-Ebene werden die Takt- und Datenleitungen einfach XOR-verknüpft. In der Software wird dies so dargestellt, dass ein Eingabestrom von Bits in einen Ausgabestrom mit doppelter Rate umgewandelt wird, wobei jede Eingabe "1" in eine "01" und jede Eingabe "0" in eine "10" übersetzt wird.
Dies ist ein einfaches Problem, das aufgrund seines Bitstream-Charakters jedoch für viele Implementierungen offen ist. Das heißt, die Codierung ist konzeptionell ein bitweiser Prozess anstelle eines byteweisen Prozesses. Wir sind uns also alle einig, dass die niedrigstwertigen Bits der Eingabe das niedrigstwertige Byte der Ausgabe sind.
Zeit zum Golfen! Schreiben Sie eine Funktion, die bei einem Array mit beliebiger Länge von Bytes ein Array der nach Manchester codierten Daten zurückgibt.
Eingabe und Ausgabe sollten als Little-Endian, niedrigstwertiges Byte zuerst und niedrigstwertiges BIT zuerst im Bitstrom betrachtet werden.
ASCII - Bitstrom Zeichnung :
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
Beispiele :
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]
Regeln :
- Die Lösung erfordert nur einen Algorithmus, um die Eingabe in die Ausgabe umzuwandeln.
- Erfassen von Eingaben und Drucken von Ausgaben sind KEIN erforderlicher Teil der Lösung, können jedoch enthalten sein. Sie werden aufgefordert, Ihren Test- / Druckcode anzugeben, wenn dieser nicht in Ihrer Lösung enthalten ist.
- Die Eingabe ist ein Array von 8-Bit-Bytes (was auch immer dies in der Sprache Ihrer Wahl bedeuten mag), KEINE Textzeichenfolge. Sie können Zeichenfolgen als Speicherformat verwenden, wenn dies in Ihrer Sprache zweckmäßig ist. Nicht druckbare Zeichen (z. B. 0xFF) müssen jedoch unterstützt werden. Bei Bedarf kann die Eingabe auch eine Länge haben.
Der Speicher für die Ausgabe muss von Ihrer Routine zugewiesen werden und wird nicht bereitgestellt.edit: unnötige anforderung- Die Ausgabe erfolgt ebenfalls in einem Array von 8-Bit-Bytes und bei Bedarf in einer Länge.
- Müssen mindestens 16KB Eingang unterstützen
- Die Leistung darf nicht zu schlecht sein: <10s für 16KB
- Das niedrigstwertige Byte zuerst im Speicher.
Seitenkanal-Herausforderung :
- Fordern Sie die Antwort eines anderen Benutzers heraus, indem Sie beweisen, dass Ihr Code schneller und speichereffizienter ist oder eine kleinere Binärdatei erzeugt!