Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python string representation of binary data

Tags:

python

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'?

like image 249
Kim Avatar asked Feb 19 '12 15:02

Kim


2 Answers

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).
like image 114
NPE Avatar answered Oct 14 '22 14:10

NPE


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

like image 22
Ofir Avatar answered Oct 14 '22 12:10

Ofir