一致的十六进制字符串到bytestring转换和输出python

时间:2015-08-03 23:03:22

标签: python output bytestring

每当我尝试将字符串(恰好是十六进制值)转换为字节字符串时,我就会得到奇怪的(看似丢失/剥离)输出。 (我坚持使用2.7,在linux UTF-8终端和Windows上测试)

>>> from binascii import unhexlify, hexlify
>>> s = '1234beef'
>>> s.decode('hex')
'\x124\xbe\xef'
>>> unhexlify(s)
'\x124\xbe\xef'

乍一看似乎我正在放弃输出:

>>> ",".join(unhexlify(s)) #in this case the \x3 is gone
'\x12,4,\xbe,\xef'

但事实证明不会丢失,可能是迭代问题?

>>> hexlify(unhexlify(s)) # \x3 was never lost
'1234beef'
>>> unhexlify(s)=='\x12\x34\xbe\xef'
>>> '\x12\x34\xbe\xef'[1]
'4'

这似乎是输出/显示问题,因为将二进制值写入文件显示3仍然存在

print '\x12\x34\xbe\xef'[1:3],
# in the file
34be0a

通过获取每个字节的ord来备份

>>> [ord(i) for i in unhexlify(s)]
[18, 52, 190, 239]

这一切让我相信我试图打印字节串的方式存在问题。

>>> str('\x12\x34\xbe\xef')
'\x124\xbe\xef'
>>> repr('\x12\x34\xbe\xef')
"'\\x124\\xbe\\xef'"

那么python社区如何输出到stdout字节串作为Ascii(或utf)?

1 个答案:

答案 0 :(得分:1)

正如你所推断的那样,一切都在发挥作用:你只是被一种不同寻常的巧合所困扰。当Python可以显示更好的表示时,她会这样做:"\t"而不是"\x09""a"而不是"\x61"。或者,在您的情况下:

>>> ord("4")
52
>>> hex(ord("4"))
'0x34'
>>> chr(ord("4"))
'4'

简单地说,数字52(显示在基数10中)映射到ascii中的数字4,因此Python会向您显示"4"而不是"\x34"

如果你选择了不同的字符串来处理你,你就不会想到任何事情被删除了,尽管你可能对这种表现感到惊讶:

>>> s ="1256beef"
>>> unhexlify(s)
'\x12V\xbe\xef'