[英]Converting list of integers into a binary “string” in python
我有一個數字列表,我想作為二進制數據發送到套接字連接。
舉個例子,我從以下列表開始:
data = [2,25,0,0,ALPHA,0,23,18,188]
在上面的列表中, ALPHA可以是介於1和999之間的任何值。最初,我將其轉換為使用的字符串
hexdata = ''.join([chr(item) for item in data])
因此,如果ALPHA為101,則返回以下字符串:
>>> data = [2,25,0,0,101,0,23,18,188]
>>> hexdata = ''.join([chr(item) for item in data])
>>> hexdata
'\x02\x19\x00\x00e\x00\x17\x12\xbc'
這很好用,'\\ x02 \\ x19 \\ x00 \\ x00e \\ x00 \\ x17 \\ x12 \\ xbc'是我需要發送的字符串。
但是,這對於超過255的ALPHA值不起作用,因為它超出了chr語句的范圍。 如果例如ALPHA是999,那么我想得到以下字符串:
data = [2,25,0,0,999,0,23,18,188]
hexdata = '\x02\x19\x00\x03\xed\x00\x17\x12\xbc'
我一直在查看struct.pack()上的文檔,但看不出如何用它來實現上面的字符串。 ALPHA是列表中唯一的變量。
任何幫助將不勝感激。
編輯1
你想要什么行為? 256到65535之間的任何內容都需要2個字節來表示。 你想在另一邊打開它嗎? 請用你的意圖更新帖子。 - gahooa 1分鍾前
多數民眾贊成正確,因為999超過256門檻,它由兩個字節表示:
data = [2,25,0,0,999,0,23,18,188]
hexdata = '\x02\x19\x00**\x03\xed**\x00\x17\x12\xbc'
這有意義嗎?
就解包而言,我只是將這些數據發送到套接字上,我將接收數據但已經處理好了。
編輯2
我發出的字符串總是固定長度。 為簡單起見,我認為最好將列表表示如下:
ALPHA = 101
data = [25,alpha1,alpha2,1]
hexdata = '\x19\x00e\x01'
ALPHA = 301
data = [25,alpha1,alpha2,1]
hexdata = 'x19\x01\x2d\x01'
正如您在hexdata字符串中看到的那樣,然后變為:\\ x01 \\ x2d \\
如果ALPHA <256,alpha1 = 0。
如果ALPHA <256,則要為ALPHA發送單個字節,如果> = 256,則為兩個字節發送? 這看起來很奇怪 - 接收器怎么知道是哪種情況...... ???
但是,如果這是你想要的,那么
x = struct.pack(4*'B' + 'HB'[ALPHA<256] + 4*'B', *data)
是實現這一目標的一種方法。
如果您事先知道數據和ALPHA位置,那么最好使用struct.pack,並為該位置設置一個大端短路,並省略可能被覆蓋的0:
def output(ALPHA):
data = [2,25,0,ALPHA,0,23,18,188]
format = ">BBBHBBBB"
return struct.pack(format, *data)
output(101) # result: '\x02\x19\x00\x00e\x00\x17\x12\xbc'
output(999) # result: '\x02\x19\x00\x03\xe7\x00\x17\x12\xbc'
你可以使用python 數組
import array
a = array.array('i')
a.extend([2,25,0,0,101,0,23,18,188])
output = a.tostring()
字節的值不能超過255,因此當ALPHA超過255時,您將不得不將其拆分為兩個字節。 這可以這樣做:
high, low = divmod(ALPHA, 255)
然后,您可以將高點和低點粘貼到值列表中。
還有其他變體,比如使用bytearray(在2.6中)或struct.pack等,但最后你必須以某種方式將這兩個字節轉換為兩個字節。
如果ALPHA <256,則要為ALPHA發送單個字節,如果> = 256,則為兩個字節發送?
另一種(也許是更通用的)方式是:
x = reduce(lambda x, y: x + y, map(lambda x: struct.pack('B', x), data))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.