Home > Backend Development > PHP Tutorial > 关于PHP中的pack问题,dht的进制流要怎么才能编码解码?

关于PHP中的pack问题,dht的进制流要怎么才能编码解码?

WBOY
Release: 2016-06-23 13:35:50
Original
1117 people have browsed it

我尝试用PHP来做一个dht爬虫,由于数据的传输使用的是bencode,这个是没问题的,可以正确编码解码,但是其中如果发送find_node数据,获取到的数据中有一个nodes,这是一个使用struct结构的二进制流编码的数据,根据dht协议所说,是:20字节的node id + 4字节的ip + 2字节的端口,我看过python里的编码解码方式,但无法转换为php中的,python中是这样转换的:

def decodeNodes(nodes):    """    把收到的nodes转成例表.     数据格式: [ (node ID, ip, port),(node ID, ip, port),(node ID, ip, port).... ]     """    n = []    nrnodes = len(nodes) / 26    nodes = unpack("!" + "20sIH" * nrnodes, nodes)    for i in xrange(nrnodes):        nid, ip, port = nodes[i * 3], numToDottedQuad(nodes[i * 3 + 1]), nodes[i * 3 + 2]	print nid        n.append((nid, ip, port))    return ndef encodeNodes(nodes):    """    "编码"nodes 与decodeNodes相反    """    n = []    for node in nodes:        n.extend([node.nid, dottedQuadToNum(node.ip), node.port])    return pack("!" + "20sIH" * len(nodes), *n)
Copy after login


请问在PHP里要如何才能够这样转换呢?


回复讨论(解决方案)

20字节的node id : a20 或  A20 如果是用空格充填不足就用后者
4字节的ip: L ip 地址用 ip2long 转换成无符号长整形数
2字节的端口: S 

打包
$s = pack('a20LS', $nodeid, ip2logn($ip), 456);
解包
$d = unpack('a20nodeid/Lip/Sport', $s);
$d['ip'] = logn2ip($d['ip']);
print_r($d); //就清楚了

20字节的node id : a20 或  A20 如果是用空格充填不足就用后者
4字节的ip: L ip 地址用 ip2long 转换成无符号长整形数
2字节的端口: S 

打包
$s = pack('a20LS', $nodeid, ip2logn($ip), 456);
解包
$d = unpack('a20nodeid/Lip/Sport', $s);
$d['ip'] = logn2ip($d['ip']);
print_r($d); //就清楚了



非常感谢,解决了
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template