在列表中插入元素,索引包含在列表中
问题描述:
我想实现字节填充。
为此我定义了一个转义字符和一个结束帧。
对于每次我找到一个结束帧,我必须改变结束帧的值(按位操作)并添加到转义字符之前。
在列表中插入元素,索引包含在列表中
我也应该检查转义字符,但我会在第二次
。
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字符的时间越来越多。
那么我该如何处理呢?
答
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')
答
在这里,在“C办法”的解决方案,但是,是不是真的Python的
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())
这真的很好。唯一的问题是它认为要更改的数据将始终是“end_frame”。为了使它更通用,我将不得不首先获取框架中的值并计算它(而不是new_end_frame,它将是new_data_after_esc)。你给了我所有的暗示去做。我upvote并将其标记为当(如果)它在我的电脑上工作时解决:) –
@Ludovic好吧 - 希望它能解决问题。我只是要你的例子:) –
该死的它是真的!为了使其工作esc字符(所以仍然不是一般的(不接待工作))我添加只添加1行!谢谢你,作为一名C开发人员,我正在寻找好的pythonic方法,而且这个方法非常棒 –