91

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?

1
  • 3
    What you want is not possible, at least not in this exact form. A bytearray of type B contains 1-byte integers, and they are always represented in decimal. Commented Jul 24, 2012 at 4:50

9 Answers 9

76

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.

Sign up to request clarification or add additional context in comments.

7 Comments

@KevanAhlquist my bad. Fixed it now.
For Python 3 this looks cleaner to me: s = "ABCD", b = bytearray(), b.extend(s.encode())
Regarding encode(), it returns a bytes object which naturally extends a bytearray.
map(ord, s) will return values > 255 unless your strings are strictly ASCII. Please update your answer to include something like s.encode('utf-8'). (Note that UTF-8 is a strict superset of ASCII, so it does not alter ASCII strings in any way.)
@9000 it is incorrect to use .encode() as well as .encode('utf-8'). Use map(ord, ...) if you don't want you bytes to be transformed. repl.it/repls/MistySubtleVisitors just press run and see the result.
|
67

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])

2 Comments

however as you can see,, array module gives a ascii value of string elements, which doesn't match with your expected output
This is the accepted answer and does not work in Python3. Could you please add the python3 version as pointed in other answers?
27

An alternative to get a byte array is to encode the string in ascii: b=s.encode('ascii').

2 Comments

Assuming that the string is ASCII to begin with. If you have s = '\x80', that's not going to work.
what if s = '\x80' what then to do?
20

Depending on your needs, this can be one step or two steps

  1. use encode() to convert string to bytes, immutable
  2. 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')

Comments

10

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

Comments

10

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

Comments

1
s = "ABCD"
from array import array
a = array("B", s)

If you want hex:

print map(hex, a)

1 Comment

Does not work in repl.it. Returns: "TypeError: cannot use a str to initialize an array with typecode 'B' "
1

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".

Comments

-1

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.