【问题标题】:What exactly does soc.recv return? [duplicate]soc.recv 究竟返回了什么? [复制]
【发布时间】:2017-02-11 11:03:45
【问题描述】:

根据 python 文档,python 的 socket recv() 方法返回一个 'byte' 类型的数组。

但是,如果打印出这个数组,也会出现看起来不像字节的东西:

\xd9\x01\x01\xa4\xe9\xcbV6\x15\xed|>g5\xfa\xbd\xe9Q\x19@i\x18\xff\

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

一些更奇怪的例子:

\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\

【问题讨论】:

    标签: python arrays sockets python-3.x byte


    【解决方案1】:

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

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

    请随意使用 Wireshark 或类似工具验证您发送的值是否符合您的预期,只有在打印时您才会看到。

    【讨论】:

    • 所以字节对象本身(例如,不打印它)将具有正确的值,即使它们不在 ASCII 编码范围内,对吗?
    • 是的,如果该值不是 ASCII 可打印的,它只会为您提供十六进制值 \x。如果您在 Wireshark 之类的东西中看到实际通过线路传输的内容,您会看到这些值是您所期望的。这只是 python 如何打印这些的人工制品。
    • 好的,非常感谢。希望剩下的逻辑能正常工作!
    • 另外请注意,如果您使用 python >3.5,您可以直接在字节上调用 .hex() 作为方法,您将看到十六进制表示。可能对您在此处的验证工作有用。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2017-05-06
    • 2019-03-06
    • 2017-10-30
    相关资源
    最近更新 更多