簡體   English   中英

在python中將整數列表轉換為二進制“字符串”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM