2011-09-26 105 views
21

我需要用原始二進制數據構建一個tcp幀,但是我發現所有關於字節的例子和教程總是涉及從字符串轉換,而這不是我所需要的。Python 3構建一個字節數組

總之,我只是需要建立一個字節數組:

0xA2 0x01 0x02 0x03 0x04

請注意,我來自C/C++的世界。

我已經試過這樣:

frame = b"" 
frame += bytes(int('0xA2',16)) 
frame += bytes(int('0x01',16)) 
frame += bytes(int('0x02',16)) 
frame += bytes(int('0x03',16)) 
frame += bytes(int('0x04',16)) 

然後拋出這個框架變量發送插座的方法,但工作不正常的幀不包含我想要什麼......

我知道這是一個關於Python的非常基本的問題,所以如果你能指點我正確的方向......

+3

上述代碼的問題在於,如果給定整數而不是列表,則「字節」的行爲會非常不同。你應該使用'frame + = bytes([int('0xa2',16)])''。 –

+0

我知道你希望(ed)動態地做到這一點,但是完全不清楚的是:輸入字節從哪裏來?你從文本文件中讀取十六進制符號?你在源代碼中寫下每個字節?你有他們在一個字節數組,你從閱讀二進制標準輸入讀取? –

回答

27

使用發送幀(數據包)一個bytearray

>>> frame = bytearray() 
>>> frame.append(0xA2) 
>>> frame.append(0x01) 
>>> frame.append(0x02) 
>>> frame.append(0x03) 
>>> frame.append(0x04) 
>>> frame 
bytearray(b'\xa2\x01\x02\x03\x04') 

,或者用你的代碼,但修復錯誤:

frame = b"" 
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03' 
frame += b'\x04' 
+0

當答案可能不會將其用作解決方案時,您將標記bytearray添加到問題中。 –

+0

@clinisbut它仍然是相關的 - 就一般意義而言,即使您不使用'bytearray'類型,您也正在使用一個字節數組(概念)。我的答案中的兩種方法都可以解決您的問題。 – agf

+0

你可以用'bytes'替換'bytearray'並得到大致相同的結果。 'bytearray'雖然是一個可變類型,所以它可能比用於構造幀的'bytes'更有用。 –

0

我認爲Scapy是你在找什麼。

http://www.secdev.org/projects/scapy/

你可以建立與它

+1

謝謝,但我更感興趣學習如何去做;) –

+0

那麼,scapy只是一個很好的工具,可以用於一般的網絡和數據包項目。我想你要找的是這樣的: > >>> from struct import * > >>>>>> packet = pack('Bbbbb',162,1,2,3,4,) > >>>包 >'\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

不相信我,我想用python解決我的問題。 –

10

那麼簡單地構建你的框架從sta ndard名單?

frame = bytes([0xA2,0x01,0x02,0x03,0x04]) 

bytes()構造函數可以從含有int值可迭代建立一個字節的幀。可迭代是什麼,它實現了迭代器協議:一個列表,迭代器,一個迭代的對象喜歡的是由range()返回...

6
frame = b'\xa2\x01\x02\x03\x04' 

不mentionned至今...

+0

但我需要動態構建框架 –

+1

構建字節數組的語法與字符串類型的作用相同:可以使用'+'或其他類似的運算符來動態構建您的字節數組。 –

相關問題