def address_bytes_to_string(proto, buf):
from .util import decode_big_endian_16
if proto.code == P_IP4:
return str(IPAddress(int(buf, 16), 4).ipv4())
elif proto.code == P_IP6:
return str(IPAddress(int(buf, 16), 6).ipv6())
elif proto.code in [P_TCP, P_UDP, P_DCCP, P_SCTP]:
return str(decode_big_endian_16(binascii.unhexlify(buf)))
elif proto.code == P_ONION:
buf = binascii.unhexlify(buf)
addr_bytes, port_bytes = (buf[:-2], buf[-2:])
addr = base64.b32encode(addr_bytes).decode('ascii').lower()
port = str(decode_big_endian_16(port_bytes))
return ':'.join([addr, port])
elif proto.code == P_IPFS:
buf = binascii.unhexlify(buf)
size, num_bytes_read = read_varint_code(buf)
buf = buf[num_bytes_read:]
if len(buf) != size:
raise ValueError("inconsistent lengths")
return base58.b58encode(buf)
raise ValueError("unknown protocol")
评论列表
文章目录