2009-10-05 118 views
2

我想在ATSC PSIP生成器的python中構建一個固定長度的數據包。這可能很簡單,但到目前爲止,我似乎無法讓它工作。我試圖建立類似於以下字段的數據包:Python固定長度數據包

table_id = 0xCB 
syntax = 0b1 
reserved = 0b11 
table_ext = 0xFF 

最終目標將是我已經嘗試了十幾個不同的東西,並不能得到二進制

'1100101111111111111' 

以下我期望的結果。 我打算通過套接字發送它,所以我相信它需要以字符串結尾。

回答

4

您可以使用struct module從任意佈局構建二進制字符串。

這隻能生成字節對齊的結構,但你需要字節對齊才能在網絡套接字上發送。

編輯:

所以,你真的生成的格式確實有不匹配位8-1-1-2-12-16等

爲了插座時」上發將需要字節對齊,但我想協議處理一些如何。 (可能與填充位的地方?)

我的新建議是建立一個位串,然後砍它成8位的塊和轉換從那裏:

input_binary_string = "110010111111111111101010" ## must be a multiple of 8 
out = [] 
while len(input_binary_string) >= 8: 
    byte = input_binary_string[:8] 
    input_binary_string = input_binary_string[8:] 
    b = int(byte,2) 
    c = chr(b) 
    out.append(c) 
## Better not have a bits left over 
assert len(input_binary_string) == 0 
outString = "".join(out) 

print [ ord(c) for c in out ] 
+0

結構似乎無法處理添加一點點......我錯過了什麼? – 2009-10-05 16:00:02

+0

可以與結構模塊和套接字一起使用的最小數據單位是1個字節 – Steg 2009-10-05 16:07:32

+0

我假設那意味着結構模塊不能幫助我。 – 2009-10-05 16:10:02

0

構建(http://construct.readthedocs.org/en/latest/)是二進制數據的解析器和構建器。它看起來非常適合這個應用程序,因爲您可以從位和字節中定義事物。它也看起來像處理條件情況以及輕鬆檢查終止符等有用的功能。

我花了多年時間使用一個系統進行復雜的數據包創建和解析,但沒有使用Construct的一些功能,所以除非在協議中有特別奇怪的地方,它看起來像Construct會處理它。