-
Notifications
You must be signed in to change notification settings - Fork 6
/
basic_coder.py
71 lines (61 loc) · 1.54 KB
/
basic_coder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/python
#coding=utf8
# by luwei
# begin:2013-9-11
# developing...
import sys,os
import socket
import header
reload(sys)
sys.setdefaultencoding('utf-8')
def btol(net_str):
#转换id和port的基础
return long(str(net_str).encode('hex'), 16)
def ltob(long_num):
#btol的逆操作
num_str = hex(long_num)[2:].rstrip('L')
if len(num_str) % 2 == 1:
num_str = '0%s' %num_str
return num_str.decode('hex')
def encode_id(node_id):
#node_id编码
if node_id < 0 or node_id >= 2 ** header.length:
return ''
encode_str = ltob(node_id)
if len(encode_str) < header.id_len:
return ('\x00' * header.id_len - len(encode_str)) + encode_str
else:
return encode_str
def decode_id(net_str):
#node_id解码
if len(net_str) != 20:
return
node_id = btol(net_str)
return node_id
def encode_port(port):
#port编码
if port < 0 or port >= 2 ** 16:
return ''
encode_port = ltob(port)
if len(encode_str) < 2:
return ('\x00' * 2 - len(encode_port)) + encode_port
else:
return encode_port
def decode_port(port_str):
#port解码
if len(port_str) != 2:
return
return btol(port_str)
def encode_addr(addr):
#地址编码
ip, port = addr
ip_str = socket.inet_aton(ip)
port_str = encode_port(port)
return ip_str+port_str
def decode_addr(addr_str):
#地址解码
if len(addr_str) != 6:
return
ip = socket.inet_ntoa(addr_str[:4])
port = decode_port(addr_str[4:])
return (ip, port)