Say that I have a 4 character string, and I want to convert this string into a byte array where each character in the string is translated into its hex equivalent. e.g.
str = "ABCD"
I’m trying to get my output to be
array('B', [41, 42, 43, 44])
Is there a straightforward way to accomplish this?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
encode function can help you here, encode returns an encoded version of the string
In [44]: str = "ABCD"
In [45]: [elem.encode("hex") for elem in str]
Out[45]: ['41', '42', '43', '44']
or you can use array module
In [49]: import array
In [50]: print array.array('B', "ABCD")
array('B', [65, 66, 67, 68])
Method 2
Just use a bytearray() which is a list of bytes.
Python2:
s = "ABCD" b = bytearray() b.extend(s)
Python3:
s = "ABCD" b = bytearray() b.extend(map(ord, s))
By the way, don’t use str as a variable name since that is builtin.
Method 3
An alternative to get a byte array is to encode the string in ascii: b=s.encode('ascii').
Method 4
This works for me (Python 2)
s = "ABCD" b = bytearray(s) # if you print whole b, it still displays it as if its original string print b # but print first item from the array to see byte value print b[0]
Reference:
http://www.dotnetperls.com/bytes-python
Method 5
This work in both Python 2 and 3:
>>> bytearray(b'ABCD') bytearray(b'ABCD')
Note string started with b.
To get individual chars:
>>> print("DEC HEX ASC")
... for b in bytearray(b'ABCD'):
... print(b, hex(b), chr(b))
DEC HEX ASC
65 0x41 A
66 0x42 B
67 0x43 C
68 0x44 D
Hope this helps
Method 6
Depending on your needs, this can be one step or two steps
- use
encode()to convert string to bytes, immutable - use
bytearray()to convert bytes to bytearray, mutable
s="ABCD"
encoded=s.encode('utf-8')
array=bytearray(encoded)
The following validation is done in Python 3.7
>>> s="ABCD"
>>> encoded=s.encode('utf-8')
>>> encoded
b'ABCD'
>>> array=bytearray(encoded)
>>> array
bytearray(b'ABCD')
Method 7
s = "ABCD"
from array import array
a = array("B", s)
If you want hex:
print map(hex, a)
Method 8
Since none of the answers is producing exactly array('B', [41, 42, 43, 44]) and the answer by avasal fails in Python 3, I post here my alternative:
import array
s = 'ABCD'
a = array.array('B', [ord(c) for c in s])
print(a)
which prints
array('B', [65, 66, 67, 68])
Note that 65-68 is the correct ASCII for “ABCD”.
Method 9
for python 3 it worked for what @HYRY posted. I needed it for a returned data in a dbus.array. This is the only way it worked
s = "ABCD"
from array import array
a = array("B", s)
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0