在列表中插入元素,索引包含在列表中

时间:2017-06-29 08:43:59

标签: python python-3.x

我想实现字节填充。
为此我定义了一个转义字符和一个结束帧 每次我找到一个结束帧时,我必须更改结束帧的值(使用按位运算)并在转义字符前添加。

我还应该检查转义字符,但我会再次检查。

frame = bytearray(b'\xae\xde\xad\xbe\xef\xde\xad\xbe\xef')
end_frame = bytearray(b'\xde\xad\xbe\xef')
esc = bytearray(b'\xaa\xbb\xcc\xdd')
end_frame_index = [i for i, x in enumerate(frame) if frame[i:i + len(end_frame)] == end_frame]
for i in range(len(frame)):
    if i in end_frame_index:
        for j in range(i,i+len(end_frame)):
            frame[j] = ~frame[j] & 0xFF

所以帧是我要发送的帧。 end_frame我必须找到的框架,esc我要添加的内容 首先,我在end_frame_index中找到主框架中结束帧的所有迭代 然后我改变找到的所有结束帧的值。

现在我想将esc字符添加到找到的所有迭代中。

我想要的输出就是这个:

bytearray(b'\xae\xaa\xbb\xcc\xdd\x21\x52\x41\x10\xaa\xbb\xcc\xdd\x21\x52\x41\x10')

我的问题是每次有esc角色时列表都会增长。

那我怎么办呢?

2 个答案:

答案 0 :(得分:1)

bytearray支持.replace方法,因此您可以预先计算新的end_frame作为替代,然后使用它并添加esc变量,例如:

frame = bytearray(b'\xae\xde\xad\xbe\xef\xde\xad\xbe\xef')
end_frame = bytearray(b'\xde\xad\xbe\xef')
# compute new end frame
new_end_frame = bytearray(~el & 0xFF for el in end_frame)
esc = bytearray(b'\xaa\xbb\xcc\xdd')

现在创建输出:

output = frame.replace(end_frame, esc + new_end_frame)

这给了你:

bytearray(b'\xae\xaa\xbb\xcc\xdd!RA\x10\xaa\xbb\xcc\xdd!RA\x10')

答案 1 :(得分:0)

这是" C方式的解决方案"但这不是真正的pythonic

frame = bytearray(b'\xae\xde\xad\xbe\xef\xde\xad\xbe\xef')
end_frame = bytearray(b'\xde\xad\xbe\xef')
esc = bytearray(b'\xaa\xbb\xcc\xdd')
new_array = bytearray()
index_new_array = 0
index_frame = 0
while index_frame < len(frame):
    if frame[index_frame:index_frame + len(end_frame)] == end_frame:
        new_array.extend(esc)
        index_new_array += len(esc)
        new_array.extend([(~x & 0xff) for i, x  in enumerate(frame[index_frame:index_frame + len(end_frame)])])
        index_new_array += len(esc)
        index_frame += len(end_frame) - 1
    else:
        new_array.append(frame[index_frame])
        index_new_array += 1

    index_frame += 1
print(new_array.hex())
相关问题