REALFREE
REALFREE

Reputation: 4396

Python byte string print incorrectly in dictionary

Consider a list contains data in byte (i.e ['\x03', '\x00', '\x32', ... ])

temp = b''

for c in field_data:
   temp += c
   print "%x" % ord(c)

above code correctly concatenates all bytes into temp (byte string literal). But when I added this into element of dictionary, output was incorrect in some cases.

testdic = {'dd':temp}
print testdic

For example, 0x0 0x0 0x0 0x0 0x0 0x0 0x33 0x32 are in list and first code show all bytes were correctly concatenated. But when I executed second code right after, output was like this:

{'dd': '\x00\x00\x00\x00\x00\x0032'}

And I'm not entirely sure why this happens.

Upvotes: 1

Views: 578

Answers (1)

Peter Gibson
Peter Gibson

Reputation: 19534

When you print a dict, it prints the braces { and } along with a representation of the contents.

>>> b = b'\x00\x0f\xff'
>>> print b
�
>>> print repr(b)
'\x00\x0f\xff'
>>> print {'test':b}
{'test': '\x00\x0f\xff'}

EDIT

The numbers 0x33 & 0x32 are the ASCII values of the characters '3' and '2'. repr will show printable ascii characters directly, while using the \x00 notation for non-printable characters.

>>> b = b'\x33\x32'
>>> print b
32
>>> print repr(b)
'32'
>>> hex(ord('3'))
'0x33'

Here's a function that I use for printing hex representations of strings

>>> def hexstr(s):
...     return '-'.join('%02x' % ord(c) for c in s)
...
>>> hexstr(b'\x00\xff\x33\x32')
'00-ff-33-32'

You might be able to subclass dict and override the __str__ representation if you want this to happen automatically.

Upvotes: 1

Related Questions