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

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停一段时间,等到有空,再写,一个好的东西,须要最好的状态去经营。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值