Python byte string print incorrectly in dictionary

元气小坏坏 提交于 2019-12-20 04:24:07

问题


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.


回答1:


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.



来源:https://stackoverflow.com/questions/22215564/python-byte-string-print-incorrectly-in-dictionary

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!