每当我尝试将字符串(恰好是十六进制值)转换为字节字符串时,我就会得到奇怪的(看似丢失/剥离)输出。 (我坚持使用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)?
答案 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'