Python 如何表示字节并将其从一种格式转换为另一种格式

Python 如何表示字节并将其从一种格式转换为另一种格式,python,python-3.x,Python,Python 3.x,我有Python中的字节:b'p\xf3g9\xea\xc3' 我知道这是一个IP地址,我知道如何将其转换为一个(这是基于->“peers值可能是一个由6个字节的倍数组成的字符串。前4个字节是IP地址,后2个字节是端口号。全网络(大端)表示法。”): 我很难理解这是怎么回事?理想情况下,我想了解如何手动将字节转换为IP地址 我有一些问题: 以字节为单位的前导P是什么 如何将这个表示(我假设它是十六进制的?)转换为基数2 我想我理解了\xf3->,它可以翻译成243。g9的输出是什么 如果有人

我有Python中的字节:
b'p\xf3g9\xea\xc3'

我知道这是一个IP地址,我知道如何将其转换为一个(这是基于->“peers值可能是一个由6个字节的倍数组成的字符串。前4个字节是IP地址,后2个字节是端口号。全网络(大端)表示法。”):

我很难理解这是怎么回事?理想情况下,我想了解如何手动将
字节
转换为IP地址

我有一些问题:

  • 以字节为单位的前导
    P
    是什么
  • 如何将这个表示(我假设它是十六进制的?)转换为基数2
  • 我想我理解了
    \xf3
    ->,它可以翻译成
    243
    。g9的输出是什么

如果有人能解释或指出我可以阅读更多的地方,那就太好了。

一个
bytes
对象的每个元素都是一个整数。查看文档:和。顺便说一句,欢迎使用堆栈溢出!请查看。要至少给出部分答案,
P
g9
是字节:0x50和0x67 0x39。它们恰好可以表示为文本。
g9
转换为十六进制
6739
,或十进制
109,57
。Python将高ASCII码打印为转义的十六进制序列,但低ASCII码不需要转义。@Maddle物理学家,这有点误导。bytes对象实际上有一个字节的原始缓冲区,但是,我们可以选择将索引编入bytes对象将返回一个
int
对象,但这是一个动态转换。我认为这是因为它“通常”是您想要的,尽管有一个PEP来添加方法来返回表示单个字节的bytes对象。片总是返回字节
import socket
import struct

p = b'P\xf3g9\xea\xc3'

print(f'peer {p}: bytes IP: {p[:4]}; bytes PORT: {p[4:]}')
# > peer b'P\xf3g9\xea\xc3': bytes IP: b'P\xf3g9'; bytes PORT: b'\xea\xc3'

print('IP', socket.inet_ntoa(p[:4]))
# -> IP 80.243.103.57

# > - big-endian; H - unsigned short
print('PORT', struct.unpack(">H", p[4:])[0])
# -> PORT 60099