您的位置:首页 > 编程语言 > Python开发

python struct模块应用.数据转换换成二进制流

2012-08-18 23:18 459 查看
class Buffer:
def __init__(self, bytes=None, recogn=10000):
if (bytes == None):
self.length = 4
self.buffer = struct.pack('i', recogn)
else:
self.length = len(bytes)
self.buffer = bytes

def write_char(self, c):
self.buffer = self.buffer + struct.pack('c', c);
self.length = self.length + 1

def write_short(self, value):
self.buffer = self.buffer + struct.pack('h', value);
self.length = self.length + 2

def write_int(self, value):
self.buffer = self.buffer + struct.pack('i', value);
self.length = self.length + 2

def write_utf(self, strings):
self.write_short(len(strings))
self.buffer = self.buffer + struct.pack('%ds' % len(strings), strings);
self.length = self.length + len(strings)

def to_bytes(self):
bytes = struct.pack('i', self.length + 4) + self.buffer
#        a,b = struct.unpack('ii',bytes)
return bytes

def read_char(self):
c, self.buffer = struct.upack('c%ds' % (len(self.buffer) - 1), self.buffer)
return c

def read_short(self):
value, self.buffer = struct.unpack('h%ds' % (len(self.buffer) - 2), self.buffer)
return value

def read_int(self):
value, self.buffer = struct.unpack('i%ds' % (len(self.buffer) - 4), self.buffer)
return value

def read_utf(self):
length = 0
self.read_short(length)
string, self.buffer = struct.unpack('i%ds' % (len(self.buffer) - length), self.buffer)
return string

很早以前,一直想写个游戏的服务器,从底层reactor,socket,epoll开始。终于,在两个月前开始了,叫dl server engine.写到现在,底层网络通讯模块基本完功,已经着手于把它分成多进程通讯,如认证服,网关,逻辑引擎等。

在测试reactor性能,懒得重新用C++写,就决定用python写个客户端测试工具,python是以前为了面试某游戏公司而学的。python的twisted网络库很好用,就决定用python加上twisted做客户端测试。在写的过程中,发现python没有把各种基本类型转换为二进制流的方法。上网百度,发现了struct这个模块,很好用,像C的printf格式化一样用。若想了解其详细用法。请百度。

参考了as的对于网络包的解包和写包的类,用python写了这个Buffer类,如果是发包,用Buffer(recogn = 10000)这个构造函数,因为一般发包到服务器的时候都带了个消息号,recogn就是消息号,写好各种数据后,调用to_bytes方法把包的长度最终二进成一个整包。如果是服务器发过来的网络包,用Buffer(bytes = package)这个构造方法,package就是服务器发来的二进制流.然后调用各个read_*方法。

最近在上班一边忙于工作,一边忙于写dl engine,感觉忙不过头,在工作上出了好多问题,晚上回来还一直想着怎么把dl engine完善,写到两三点。。感觉有点累。。这段时间,暂笔,把dl engine停一段时间,等到有空,再写,一个好的东西,须要最好的状态去经营。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息