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'
?
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).\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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With