2016-10-03 81 views
1

根据python文档,python的socket recv()方法返回一个'byte'类型的数组。soc.recv究竟返回什么?

但是,如果你要打印出此阵,事情并不像字节也会出现:

\xd9\x01\x01\xa4\xe9\xcbV6\x15\xed|>g5\xfa\xbd\xe9Q\[email protected]\x18\xff\ 

是否蟒蛇字节对象有一些内部错误报告什么的?这些字节对象看起来并不是实际返回的字节?

一些更奇怪的例子:

\x00w\xd4\x04;\x9c\x0b}>P]\xa4\xbd\xa5n:9x\xe3>9\xd2/~8\ 

\x01\x01\x1b ,Y\x00\x00\x00\x00\x00\xf4 

\xa0A\n\xd7tB}\xed,\xc0\x00\ 

回答

1

recv剂量确实返回原始字节。只有在打印时,Python字节才会采用ASCII编码,如果该值落在可打印ASCII值的范围内,则会将其打印为由该8位值表示的ASCII字符。如果不是可打印的ASCII码,它将通过\x转义该值并打印十六进制。

请注意,如果您使用的是python 3.5,则可以在上面的字节上调用.hex并查看十六进制值是什么。这应该确认你正在获得你期望的值。

随时通过使用Wireshark或类似软件验证您所发送的值是否符合您的期望值,只有在打印中您才会看到这一点。

+0

因此,字节对象本身(如在,不打印它)将具有适当的值,即使它们不在ASCII编码内,是正确的吗? – user1519665

+0

是的,如果该值不是ASCII可打印的,它只是给你十六进制值'\ x'。如果你看到Wireshark之​​类的东西,你会发现这些值是你期望的。这仅仅是python如何打印这些文件的人工产物。 – shuttle87

+0

好吧,非常感谢。希望其余的逻辑能正常工作! – user1519665