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?

Mark Rotteveel
110k241 gold badges160 silver badges233 bronze badges
asked Jul 24, 2012 at 4:29
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.

answered Mar 20, 2015 at 14:32
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])
answered Jul 24, 2012 at 4:39

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').

josliber
44.4k12 gold badges104 silver badges136 bronze badges
answered Jul 19, 2015 at 6:42

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')
Lleims
1,37324 silver badges48 bronze badges
answered Aug 1, 2020 at 23:45

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

answered Apr 22, 2019 at 17:17

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

answered May 27, 2016 at 3:13

Comments

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

If you want hex:

print map(hex, a)
Anthony
12.5k10 gold badges72 silver badges107 bronze badges
answered Jul 24, 2012 at 4:51

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

answered Dec 15, 2021 at 14:04

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)
Zoe - Save the data dump
28.4k22 gold badges130 silver badges163 bronze badges
answered Dec 19, 2018 at 15:08

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.