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