zwol
zwol

Reputation: 140786

chr() equivalent returning a bytes object, in py3k

Python 2.x has chr(), which converts a number in the range 0-255 to a byte string with one character with that numeric value, and unichr(), which converts a number in the range 0-0x10FFFF to a Unicode string with one character with that Unicode codepoint. Python 3.x replaces unichr() with chr(), in keeping with its "Unicode strings are default" policy, but I can't find anything that does exactly what the old chr() did. The 2to3 utility (from 2.6) leaves chr calls alone, which is not right in general :(

(This is for parsing and serializing a file format which is explicitly defined in terms of 8-bit bytes.)

Upvotes: 53

Views: 30636

Answers (7)

kxr
kxr

Reputation: 5538

Fastest is:

int2byte = struct.Struct(">B").pack

(from six), followed by:

b'%c' % x

Both are even compatible with Python 2 and (surprisingly) faster there than chr(x).

Upvotes: 1

Glushiator
Glushiator

Reputation: 683

simple replacement based on small range memoization (should work on 2 and 3), good performance on CPython and pypy

binchr = tuple([bytes(bytearray((b,))) for b in range(256)]).__getitem__

binchr(1) -> b'\x01'

Upvotes: 0

Ecir Hana
Ecir Hana

Reputation: 11508

Yet another alternative (Python 3.5+):

>>> b'%c' % 65
b'A'

Upvotes: 11

youfu
youfu

Reputation: 1627

In case you want to write Python 2/3 compatible code, use six.int2byte

Upvotes: 9

SangYoung Lee
SangYoung Lee

Reputation: 156

>>> import struct
>>> struct.pack('B', 10)
b'\n'
>>> import functools
>>> bchr = functools.partial(struct.pack, 'B')
>>> bchr(10)
b'\n'

Upvotes: 8

Guido U. Draheim
Guido U. Draheim

Reputation: 3271

Consider using bytearray((255,)) which works the same in Python2 and Python3. In both Python generations the resulting bytearray-object can be converted to a bytes(obj) which is an alias for a str() in Python2 and real bytes() in Python3.

# Python2
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
' !'

# Python3
>>> x = bytearray((32,33))
>>> x
bytearray(b' !')
>>> bytes(x)
b' !'

Upvotes: 23

Mark Byers
Mark Byers

Reputation: 838896

Try the following:

b = bytes([x])

For example:

>>> bytes([255])
b'\xff'

Upvotes: 59

Related Questions