Kim
Kim

Reputation: 3494

Python string representation of binary data

I'm trying to understand the way Python displays strings representing binary data.

Here's an example using os.urandom

In [1]: random_bytes = os.urandom(4)

In [2]: random_bytes
Out[2]: '\xfd\xa9\xbe\x87'

In [3]: random_bytes = os.urandom(4)

In [4]: random_bytes
Out[4]: '\r\x9eq\xce'

In the first example of random_bytes, after each \x there seem to be values in hexadecimal form: fd a9 be 87.

In the second example, however, I don't understand why '\r\x9eq\xce' is displayed.

Why does Python show me these random bytes in this particular representation? How should I interpret '\r\x9eq\xce'?

Upvotes: 7

Views: 6372

Answers (2)

NPE
NPE

Reputation: 500267

It's only using the \xHH notation for characters that are (1) non-printable; and (2) don't have a shorter escape sequence.

To examine the hex codes, you could use the binascii module:

In [12]: binascii.hexlify('\r\x9eq\xce')
Out[12]: '0d9e71ce'

As you can see:

  • \r is the same as \x0d (it's the ASCII Carriage Return character, CR);
  • q is the same as \x71 (the latter is the hex ASCII code of the former).

Upvotes: 12

Ofir
Ofir

Reputation: 8362

\r is a carriage return, q is the q character - you should refer to their ASCII values (0x0d and 0x71)

Whenever python can - it will display the corresponding ASCII character, you'll only see \x when it can't (usually when the byte is higher than 0x79)

Upvotes: 3

Related Questions