2010-08-12 137 views
26

我有一個整數ascii值的列表,我需要轉換成一個字符串(二進制)用作加密操作的關鍵字。 (我重新實現在Python的Java加密代碼)到字符串(字節數組)的整數列表 - python

此作品(假設爲8字節密鑰):

key = struct.pack('BBBBBBBB', 17, 24, 121, 1, 12, 222, 34, 76) 

不過,我寧願沒有密鑰長度和解壓()參數列表硬編碼。

我該如何正確實施這個,給定一個初始的整數列表?

謝謝! 「呼叫f(..., *args ,...)時,讓args = sequence」 或者說, -

+0

爲什麼你需要一個'二進制'字符串? – relet 2010-08-12 17:36:27

回答

37

我更喜歡array模塊到struct模塊對這類任務(涉及均勻值序列的):

>>> import array 
>>> array.array('B', [17, 24, 121, 1, 12, 222, 34, 76]).tostring() 
'\x11\x18y\x01\x0c\xde"L' 

沒有len電話,沒有必要字符串處理,等等 - 快,簡單,直接,爲什麼更喜歡其他方法?

+1

這對我來說最合乎邏輯。謝謝你的提示! – mikewaters 2010-08-12 18:54:43

8
struct.pack('B' * len(integers), *integers) 

*sequence意味着 「解包序列」。

+0

有趣;我應該意識到我可以在字符串上使用乘法,但我不知道'解壓序列'。謝謝! – mikewaters 2010-08-12 18:53:24

49

對於Python 2.6和更高版本,如果你正在處理的字節那麼bytearray是最明顯的選擇:

>>> str(bytearray([17, 24, 121, 1, 12, 222, 34, 76])) 
'\x11\x18y\x01\x0c\xde"L' 

對我來說這甚至比亞歷克斯·馬爾泰利的答案更直接的 - 仍然沒有字符串操作或len通話但現在你甚至不需要導入任何東西!

+2

對於那些想知道的人,Alex Martelli的答案似乎運行得更快,至少在我的Python 2.7.7基準測試中。對於10,000次運行,他的回答是12ms,對此是18ms;這些數字是可重複的,變化很小。當獲得大量數據時,這並不是一個巨大的收益。也就是說,這個答案對我來說實際上更快8ms:http://stackoverflow.com/a/12073686/353094 – leetNightshade 2014-09-01 17:02:36

+3

@leetNightshade這在Python 3.4.1 x86中說這個方法是根據我的基準測試最快的。 – leetNightshade 2014-09-01 17:16:00

21

這是恢復一個老問題,但在Python 3,你可以用bytes直接:使用map()函數(適用於Python 2.7版)

>>> bytes([17, 24, 121, 1, 12, 222, 34, 76]) 
b'\x11\x18y\x01\x0c\xde"L' 
+0

優秀,乾淨,簡單! – 2016-02-16 21:41:17

+0

這可能是「最正確」的答案python3 – 2017-06-27 18:55:28

+0

如何做到完全相反? (字節 - >數組) – Tino 2018-01-02 06:22:34

0

較短的版本以前:

"".join(map(chr, myList))