2015-05-11 49 views
0

我有一個遊戲,我正在與一些網絡,使其多人。我創建了一個自定義模塊(不是最好的),將兩個值(XY)從-1048576轉換爲+1048576,將0到60(健康)的值轉換爲6個字符。所以在6個字節中,我可以發送所有的信息。Python 3插槽,無法接收數據(編碼,解碼)

但是,這是在Python 2,在Python 3中工作我發現我不能發送'字符'的字符,所以我使用'.encode()'之前發送它和'.decode() '之前使用它在我的任何功能。但這似乎並不奏效。

我不太確定。任何幫助?

模塊:

#IMPORT MODULES 
from sys import version_info 

#------------------------------------------------------------------------------ 

#FUNTIONS 
#Binary String to Characters 
def BinToMsg(text): 
    if version_info[0] <= 2: return "".join(chr(int(text[i:i+8], 2)) for i in range(0, len(text), 8)) 
    else: 
     data = "".join(chr(int(text[i:i+8], 2)) for i in range(0, len(text), 8)) 
     return data.encode() 

#Characters to Binary String 
def MsgToBin(text): 
    if version_info[0] <= 2: return "".join('{:08b}'.format(ord(c)) for c in text) 
    else: 
     text = text.decode() 
     return "".join('{:08b}'.format(ord(c)) for c in text) 

#Corrects 0's values in Binary Strings 
def fixDigit(text, digits): 
    lenth = digits - len(text) 
    for loop in range(lenth): text = "0" + text 
    return text 

#Data to Characters 
def DataToMsg(x,y,health): 

    if health >= 2**6 or health < 0: return None 
    bins = fixDigit(bin(health)[2:],6) 
    for cord in (x,y): 
     if cord >= 2**20: return None 
     if cord < 0: bins += "0" 
     else: bins += "1" 
     bins += fixDigit(bin(int(str(cord).replace("-","")))[2:],20) 

    return BinToMsg(bins) 

#Characters to Data 
def MsgToData(msg): 

    bins = MsgToBin(msg) 
    data = {"Health":int(bins[:6],2)} 
    data["X"] = int(bins[7:27],2) 
    data["Y"] = int(bins[28:48],2) 
    if bins[6] == "0": data["X"] *= -1 
    if bins[27] == "0": data["Y"] *= -1 

    return data 

這將被用於這樣的...

Player = {"X":-1234,"Y":5678,"Health":23} 
... 
connection.send(DataToMsg(Player["X"],Player["Y"],Player["Health"])) 
... 
print(MsgToData(connection.recv(6)) 
... 
Output: {"X":-1234,"Y":5678,"Health":23} 

回答

0

當字符串是UTF-8(默認編碼)的長度增加編碼。因此,如果將connection.recv()設置爲6,則不會收到所有信息。只是一些切碎。所以當你解碼它會給你一個錯誤。

爲了保持相同的長度,我發現將它編碼爲「cp037」很有用。

使用

string.encode("cp037") 
... 
string.decode("cp037") 
相關問題