python-使用struct模块实现16进制网络封包数据读写

在这里插入图片描述

import struct
class HexToolErroe(Exception):
    def __init__(self,errorinfo):
        super(HexToolErroe, self).__init__()
        self.errorinfo=errorinfo
    def __str__(self):
        return self.errorinfo


class hextool_write(object):
    def __init__(self,encoding='gbk',endianness='>'):
        super(hextool_write, self).__init__()
        self.encoding=encoding
        self.endianness=endianness
        self.data=b''

    def wint(self,value):
        self.data+=struct.Struct(self.endianness+'I').pack(value)
        # self.data += struct.pack(self.endianness + 'I', value)

    def wshort(self,value):
        self.data+=struct.Struct(self.endianness+'H').pack(value)


    def wbyte(self,value):
        self.data+=struct.Struct(self.endianness+'b').pack(value)


    def wstring_s(self,value):

        str = value.encode(self.encoding)
        slen = len(str)
        self.data+=struct.Struct(self.endianness+'b{}s'.format(slen)).pack(slen,str)


    def wstring_l(self, value):

        str=value.encode(self.encoding)
        slen = len(str)
        self.data += struct.Struct(self.endianness + 'H{}s'.format(slen)).pack(slen,str)


    def get_rawdata(self):
        return self.data
    def get_hexdata(self):
        return self.data.hex(' ').upper()
    def len(self):
        return len(self.data)


class hextool_read(object):
    def __init__(self,encoding='gbk',endianness='>'):
        super(hextool_read, self).__init__()
        self.encoding=encoding
        self.endianness=endianness
        self.data=b''
        self.index=0
        self.len=0

    def setdata(self,data):
        self.data=data
        self.len=len(data)
        self.index = 0

    def rint(self):
        if self.len-4<0:
            raise HexToolErroe("索引超出")
        (value,)= struct.unpack(self.endianness + 'I', self.data[self.index:self.index + 4])
        self.index += 4
        self.len -=4
        return value

    def rshort(self):
        if self.len-2<0:
            raise HexToolErroe("索引超出")
        (value,)= struct.unpack(self.endianness + 'H', self.data[self.index:self.index + 2])
        self.index += 2
        self.len -=2
        return value

    def rbyte(self):
        if self.len-1<0:
            raise HexToolErroe("索引超出")
        (value,)= struct.unpack(self.endianness + 'b', self.data[self.index:self.index + 1])
        self.index += 1
        self.len -= 1
        return value


    def rstring_l(self):
        slen = self.rshort()
        if self.len - slen < 0:
            raise HexToolErroe("索引超出")

        (value,) = struct.unpack(self.endianness + '{}s'.format(slen), self.data[self.index:self.index + slen])
        self.index += slen
        self.len -= slen
        return value.decode("gbk")

    def rstring_s(self):
        slen = self.rbyte()
        if self.len - slen < 0:
            raise HexToolErroe("索引超出")

        (value,) = struct.unpack(self.endianness + '{}s'.format(slen), self.data[self.index:self.index + slen])
        self.index += slen
        self.len-=slen
        return value.decode("gbk")
    
    def get_index(self):

        return  self.index
    def get_currentlen(self):

        return self.len

    def get_datalen(self):
        return len(self.data)



if __name__ == '__main__':
    x=hextool_write()
    x.wint(1)
    x.wstring_s('开心')
    x.wbyte(1)
    x.wstring_l('非常好')
    x.wshort(100)
    print(x.get_hexdata())

    y=hextool_read()
    y.setdata(x.get_rawdata())
    print('整数:',y.rint())
    print('短字符串:',y.rstring_s())
    print('字节:',y.rbyte())
    print('长字符串:',y.rstring_l())
    print('短整数:',y.rshort())
    print(y.get_currentlen())
    print(y.get_index())
    # print(y.rshort())




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒与花生米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值