我正在阅读一个阅读的例子
比特填充.假设数据链路层从网络层接收到以下位串:01110111101111101111110.位填充后的结果字符串是什么?加粗已添加的每一位.
回答:
0111011110111110011111010
^ ^
Run Code Online (Sandbox Code Playgroud)
这个答案是如何达成的?我的理解是位填充通过在帧的开头和结尾插入特定的位序列(称为标志值)来工作.我没有得到的是:
附加信息:我认为这个网络是以太网.
附加信息2:位标志是01111110
老实说,我认为我理解,但不是不完整的答案,因为他们没有将旗帜01111110添加到最后或be?他们只是在消息中出现这种位模式时进行处理.
其他例子:这里他们也这样做.
我正在做一些串行协议的东西,并希望在python中实现一个基本的字节填充算法.我正在努力确定什么是最pythonic方式来做到这一点.
字节填充基本上只是用一个由转义字节组成的对和用可逆方式转换的原始字节(例如xor'ed)替换任何"保留"字节.
到目前为止,我已经有了5种不同的方法,每种方法都有一些我不喜欢的方法:
def stuff1(bits):
for byte in bits:
if byte in _EscapeCodes:
yield PacketCode.Escape
yield byte ^ 0xFF
else:
yield byte
Run Code Online (Sandbox Code Playgroud)
这可能是我最喜欢的,但也许只是因为我对基于产量的发电机着迷.我担心发电机会让它变慢,但它实际上是第二快的.
def stuff2(bits):
result = bytes()
for byte in bits:
if byte in _EscapeCodes:
result += bytes([PacketCode.Escape, byte ^ 0xFF])
else:
result += bytes([byte])
return result
Run Code Online (Sandbox Code Playgroud)
不断创建单个元素数组只是为了抛出它们,因为我不知道任何"带有一个额外元素的复制"操作.它与最慢的一群联系在一起.
def stuff3(bits):
result = bytearray()
for byte in bits:
if byte in _EscapeCodes:
result.append(PacketCode.Escape)
result.append(byte ^ 0xFF)
else:
result.append(byte)
return result
Run Code Online (Sandbox Code Playgroud)
似乎比直接bytes()方法更好.实际上比yield生成器慢,并且可以一次执行一个字节(而不是需要中间1个元素集合).但它感到野蛮.这是包装性能的中间部分.
def stuff4(bits): …Run Code Online (Sandbox Code Playgroud) 接收节点 (CAN-BUS) 如何知道位填充不是数据的实际位部分?
检查下面的这个例子。两者都是有效的流,但它们的内容不同:
VALID - 位填充流(我用粗体填充零)
11111 0 10101
VALID - 不是位填充流
11111010101