Decimal数据类型在网络传输中用的是可转换成string的bytes,因此
编码过程:Decimal->String->bytes->网络
解码过程:网络->bytes->String->Decimal
通信协议:类型+长度+数据
A: 从java到python传递时,需要将接收到的bytes转换成字符串:
def recvString(self):
nret = int.from_bytes(self.sock.recv(4), byteorder = 'big')
if nret>0:
rv=self.sock.recv(nret*2)
sret = str(rv,encoding="utf-16be")
return sret
else:
return ""
def recvData():
nval = self.recvString()
#判断是否带小数部分
p = re.search("(\d+)\.(\d+)", nval)
if p:
#将小数部分最后是0的字符串去掉(若都是0,则.也要去掉)
ret = Decimal(re.sub(r'\.?(0+)$', "", nval))
else:
ret = Decimal(nval) #只是整数部分.
B. 从python到java传递时,需要将Decimal转换成bytes:
def convertData(ntype, data):
.............................................
#其中Decimal序列化部分
sval = str(Decimal(data))
dataLen = len(sval)
fmt="!BI{}s".format(dataLen*2)
#fmt为数据类型+数据长度+数据.
ret = struct.pack(fmt, ntype, dataLen, sval.encode(encoding='utf_16be'))
python结合正则表达式,实现字符串的判断与替换还是比较灵活、强大。
python下的Decimal数据类型转换实现网络传递,不知道是不是有更好的办法,希望留言讨论.