Output from to_bytes

Chris Angelico rosuav at gmail.com
Sun May 26 09:26:33 EDT 2013


On Sun, May 26, 2013 at 10:02 PM, Mok-Kong Shen
<mok-kong.shen at t-online.de> wrote:
> I don't understand why with the code:
>
>    for k in range(8,12,1):
>      print(k.to_bytes(2,byteorder='big'))
>
> one gets the following output:
>
>    b'\x00\x08'
>    b'\x00\t'
>    b'\x00\n'
>    b'\x00\x0b'
>
> I mean the 2nd and 3rd should be b'\x00\x09' and b'x00\x0a'.
> Anyway, how could I get the output in the forms I want?

They are. If you compare them, you'll find they're identical:

>>> b'\x00\t' == b'\x00\x09'
True
>>> b'\x00\n' == b'\x00\x0a'
True

It's just a representation issue. The repr() of a bytes tries to go
for the shorter representation \n rather than the more verbose \x0a.
(Though I'm not sure why it doesn't also shorten \x00 to \0 - maybe
the \0 notation isn't deemed Pythonic, even though it does work just
fine.) So what you want is a more fixed representation.

What you may find useful here is that iterating over the bytes object
produces integers:

>>> list(b'\0\t')
[0, 9]

So you might be able to do something like this:

>>> print(''.join(('\\x%02x'%x for x in b'\0\t')))
\x00\x09

Or, in your whole loop:

>>> for k in range(8,12,1):
	print(''.join(('\\x%02x'%x for x in k.to_bytes(2,byteorder='big'))))

\x00\x08
\x00\x09
\x00\x0a
\x00\x0b

Does that help?

ChrisA



More information about the Python-list mailing list