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

来源:互联网 发布:交友软件有哪些 编辑:程序博客网 时间:2024/06/05 08:05
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停一段时间,等到有空,再写,一个好的东西,须要最好的状态去经营。

原创粉丝点击