tags:

views:

54

answers:

4

I have a list of integer ascii values that I need to transform into a string (binary) to use as the key for a crypto operation. (I am re-implementing java crypto code in python)

This works (assuming an 8-byte key):

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

However, I would prefer to not have the key length and unpack() parameter list hardcoded.

How might I implement this correctly, given an initial list of integers?

Thanks!

A: 
key = "".join( chr( val ) for val in myList )
katrielalex
+1  A: 
struct.pack('B' * len(integers), *integers)

*sequence means "unpack sequence" - or rather, "when calling f(..., *args ,...), let args = sequence".

delnan
Interesting; I should have realized that I could use multiplication on the string, but I did not know about the 'unpack sequence'. Thank you!
threecheeseopera
+2  A: 

I much prefer the array module to the struct module for this kind of tasks (ones involving sequences of homogeneous values):

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

no len call, no string manipulation needed, etc -- fast, simple, direct, why prefer any other approach?!

Alex Martelli
This makes the most sense to me, logically. Thanks for the tip!
threecheeseopera
+1  A: 

For Python 2.6 and later if you are dealing with bytes then a bytearray is the most obvious choice:

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

To me this is even more direct than Alex Martelli's answer - still no string manipulation or len call but now you don't even need to import anything!

Scott Griffiths