曼彻斯特编码是一种用于无线电通信的电信协议,该协议可确保按固定间隔进行位转换,因此接收器可以从数据本身中恢复时钟速率。它使比特率翻倍,但价格便宜且易于实现。它被业余无线电运营商广泛使用。
这个概念非常简单:在硬件级别,时钟和数据线只是简单地异或在一起。在软件中,这被描述为将位的输入流转换为双倍速率的输出流,每个输入“ 1”转换为“ 01”,每个输入“ 0”转换为“ 10”。
这是一个容易解决的问题,但由于其比特流的性质,因此对许多实现开放。即,编码在概念上是逐位处理而不是逐字节处理。因此,我们都同意字节序,输入的最低有效位成为输出的最低有效字节。
打高尔夫球的时间!编写一个函数,给定任意长度的字节数组,该函数返回该曼彻斯特编码数据的数组。
在位流中,应将输入和输出视为低位字节序,最低有效字节在前,最低有效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
例子:
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]
规则:
- 解决方案仅需要将输入转换为输出的算法。
- 获取输入和打印输出不是解决方案的必需部分,但可以包括在内。如果您的解决方案中未包含测试/打印代码,则建议您提供。
- 输入是一个8位字节的数组(无论用您选择的语言可能意味着什么),而不是文本字符串。如果方便,可以使用字符串作为存储格式,但是必须支持不可打印的字符(例如0xFF)。如有必要,输入也可以取一个长度。
输出的内存必须由您的例程分配,而不是提供。编辑:不必要的要求- 输出也是一个8位字节的数组,如果需要的话,还有一个长度。
- 必须至少支持16KB输入
- 性能一定不能太糟糕:16KB <10s
- 内存中的最低有效字节优先。
旁道挑战:
- 通过证明您的代码更快,内存效率更高或产生更小的二进制代码来挑战另一个用户的答案!