美文网首页
struct 网络字节转换

struct 网络字节转换

作者: 仙灵儿 | 来源:发表于2018-11-22 23:07 被阅读15次

    属性
    format
    格式化字符串。
    size
    结构体的大小。

    实例:
    1.通常的打包和解包

    打包和解包
    import struct
    import binascii
    
    values = (1, b'good', 1.22) #查看格式化对照表可知,字符串必须为字节流类型。
    s = struct.Struct('I4sf')
    packed_data = s.pack(*values)
    unpacked_data = s.unpack(packed_data)
      
    print('Original values:', values)
    print('Format string :', s.format)
    print('Uses :', s.size, 'bytes')
    print('Packed Value :', binascii.hexlify(packed_data))
    print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)
    

    结果:

    Original values: (1, b'good', 1.22)
    Format string : b'I4sf'
    Uses : 12 bytes
    Packed Value : b'01000000676f6f64f6289c3f'
    Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
    [Finished in 0.1s]
    

    说明:

    首先将数据对象放在了一个元组中,然后创建一个Struct对象,并使用pack()方法打包该元组;最后解包返回该元组。
    这里使用到了binascii.hexlify(data)函数。
    binascii.hexlify(data)

    2.使用buffer来进行打包和解包
    使用通常的方式来打包和解包会造成内存的浪费,所以python提供了buffer的方式:

    """
    通过buffer方式打包和解包
    """
    import struct
    import binascii
    import ctypes
     
    values = (1, b'good', 1.22) #查看格式化字符串可知,字符串必须为字节流类型。
    s = struct.Struct('I4sf')
    buff = ctypes.create_string_buffer(s.size)
    packed_data = s.pack_into(buff,0,*values)
    unpacked_data = s.unpack_from(buff,0)
      
    print('Original values:', values)
    print('Format string :', s.format)
    print('buff :', buff)
    print('Packed Value :', binascii.hexlify(buff))
    print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)
    

    结果:

    Original values1: (1, b'good', 1.22)
    Original values2: (b'hello', True)
    buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
    Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
    Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
    Unpacked Type : <class 'tuple'>  Value: (b'hello', True)
    [Finished in 0.1s]
    

    说明:
    针对buff对象进行打包和解包,避免了内存的浪费。
    这里使用到了函数
    ctypes.create_string_buffer(init_or_size,size = None)
    创建可变字符缓冲区。
    返回的对象是c_char的ctypes数组。
    init_or_size必须是一个整数,它指定数组的大小,或者用于初始化数组项的字节对象。

    3.使用buffer方式来打包多个对象

    import struct
    import binascii
    import ctypes
     
    values1 = (1, b'good', 1.22) #查看格式化字符串可知,字符串必须为字节流类型。
    values2 = (b'hello',True)
    s1 = struct.Struct('I4sf')
    s2 = struct.Struct('5s?')
    buff = ctypes.create_string_buffer(s1.size+s2.size)
    packed_data_s1 = s1.pack_into(buff,0,*values1)
    packed_data_s2 = s2.pack_into(buff,s1.size,*values2)
    unpacked_data_s1 = s1.unpack_from(buff,0)
    unpacked_data_s2 = s2.unpack_from(buff,s1.size)
      
    print('Original values1:', values1)
    print('Original values2:', values2)
    print('buff :', buff)
    print('Packed Value :', binascii.hexlify(buff))
    print('Unpacked Type :', type(unpacked_data_s1), ' Value:', unpacked_data_s1)
    print('Unpacked Type :', type(unpacked_data_s2), ' Value:', unpacked_data_s2)
    

    结果:

    Original values2: (b'hello', True)
    buff : <ctypes.c_char_Array_18 object at 0x000000D5A5617348>
    Packed Value : b'01000000676f6f64f6289c3f68656c6c6f01'
    Unpacked Type : <class 'tuple'>  Value: (1, b'good', 1.2200000286102295)
    Unpacked Type : <class 'tuple'>  Value: (b'hello', True)
    [Finished in 0.1s]
    

    相关文章

      网友评论

          本文标题:struct 网络字节转换

          本文链接:https://www.haomeiwen.com/subject/qqtdqqtx.html