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
def getMessageLength(message): length = None if len(message)>=4: #length is decodeable... length = binaryToLongInt(message[:4]) return length