def decodeHandshake(message): length = binaryToShortInt(message[0]) proto = message[1:20] reserved = message[20:28] infoHash = message[28:48] peerId = message[48:68] return length, proto, reserved, infoHash, peerId
def decodeMessage(message): length = binaryToLongInt(message[:4]) if length==0: #keepalive result = (-1, None) else: numericMessageTyp = binaryToShortInt(message[4]) if numericMessageTyp<0 or numericMessageTyp>8: #unknown messagetype result = (-2, None) elif numericMessageTyp>=0 and numericMessageTyp<=3 and length==1: #choke, unchoke, interested, notinterested result = (numericMessageTyp, None) elif numericMessageTyp==4 and length==5: #have result = (numericMessageTyp, binaryToLongInt(message[5:9])) elif numericMessageTyp==5: #bitfield result = (numericMessageTyp, binaryToBin(message[5:])) elif numericMessageTyp==6 and length==13: #request result = (numericMessageTyp, (binaryToLongInt(message[5:9]),\ binaryToLongInt(message[9:13]),\ binaryToLongInt(message[13:17]))) elif numericMessageTyp==7: #piece result = (numericMessageTyp, (binaryToLongInt(message[5:9]),\ binaryToLongInt(message[9:13]),\ message[13:])) elif numericMessageTyp==8 and length==13: #cancel result = (numericMessageTyp, (binaryToLongInt(message[5:9]),\ binaryToLongInt(message[9:13]),\ binaryToLongInt(message[13:17]))) else: #corrupt message result = (None, None) return result