2017-06-29 114 views
0

我想實現字節填充。
爲此我定義了一個轉義字符和一個結束幀。
對於每次我找到一個結束幀,我必須改變結束幀的值(按位操作)並添加到轉義字符之前。
在列表中插入元素,索引包含在列表中

我也應該檢查轉義字符,但我會在第二次

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字符的時間越來越多。

那麼我該如何處理呢?

回答

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') 
+0

這真的很好。唯一的問題是它認爲要更改的數據將始終是「end_frame」。爲了使它更通用,我將不得不首先獲取框架中的值並計算它(而不是new_end_frame,它將是new_data_after_esc)。你給了我所有的暗示去做。我upvote並將其標記爲當(如果)它在我的電腦上工作時解決:) –

+0

@Ludovic好吧 - 希望它能解決問題。我只是要你的例子:) –

+0

該死的它是真的!爲了使其工作esc字符(所以仍然不是一般的(不接待工作))我添加只添加1行!謝謝你,作爲一名C開發人員,我正在尋找好的pythonic方法,而且這個方法非常棒 –

0

在這裏,在「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()) 
相關問題