How to convert string to byte array in Python
Question:
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:
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])
s = "ABCD"
from array import array
a = array("B", s)
If you want hex:
print map(hex, a)
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.
An alternative to get a byte array is to encode the string in ascii: b=s.encode('ascii')
.
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
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)
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
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')
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".
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?
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])
s = "ABCD"
from array import array
a = array("B", s)
If you want hex:
print map(hex, a)
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.
An alternative to get a byte array is to encode the string in ascii: b=s.encode('ascii')
.
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
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)
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
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')
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".