• python struct 模块


    struct模块用于二进制和结构体之间的互相转化,此模块中大部分函数接受一个实现了Buffer协议的对象,最常见的实现了Buffer协议的对象包括bytes、bytearray等,大多数像byte数组这样的对象都实现了Buffer协议。

    struct模块的函数

    struct模块的函数很少,只有6个。

    struct.pack(format, v1, v2, ...):将多个value如v1、v2按照format进行格式化
    struct.pack_into(format, buffer, offset, v1, v2, ...):将多个value如v1、v2按照format格式化到buffer的offset处
    struct.unpack(format, buffer):从buffer中按照format解析对象
    struct.unpack_from(format, buffer, offset=0):从buffer的某个offset处解析对象
    struct.iter_unpack(format, buffer):以迭代的形式从buffer中解析对象
    struct.calcsize(format):返回format所指定的数据类型的字节数
    从以上函数看出,struct模块中格式化字符串format非常重要,format包括两部分:控制部分、类型部分。

    以Struct的形式调用struct包的能

    struct包提供了Struct类,这个类的构造函数接受一个format串,从而可以使用对象的函数了,可以避免传format参数。

    msgpack中的Packer和Unpacker也是类似的作用。

    举例

    demo1:将int转换为bytes

    buf1 = 256
    bin_buf1 = struct.pack('i', buf1)  # 'i'代表'integer'
    ret1 = struct.unpack('i', bin_buf1)
    print(bin_buf1, '  <====>  ', ret1)
    

    这段程序将256这个数字通过pack函数转化成了bytes类型,其中pack的第一个参数i表示buf1为int类型的数据。

    demo2:将浮点数转化为bytes

    buf2 = 3.1415
    bin_buf2 = struct.pack('d', buf2)  # 'd'代表'double'
    ret2 = struct.unpack('d', bin_buf2)
    print(bin_buf2, '  <====>  ', ret2)
    

    demo3:将字符串转换为bytes

    # 字符串 -> 二进制流
    buf3 = 'Hello World'
    bin_buf3 = struct.pack('11s', bytes(buf3,encoding='ascii'))  # '11s'代表长度为11的'string'字符数组
    ret3 = struct.unpack('11s', bin_buf3)
    print(bin_buf3, '  <====>  ', ret3)
    

    这里的11s表示buf3为长度11个字符的数组。同理,也可以使用“11i”表示11个int类型的数据,还可以使用“iiiiiiiiiii”表示11i

    demo4:将结构体转化为bytes

    # 结构体 -> 二进制流
    # 假设有一个结构体
    # struct header {
    #   int buf1;
    #   double buf2;
    #   char buf3[11];
    # }
    bin_buf_all = struct.pack('id11s', buf1, buf2, bytes(buf3,encoding='ascii'))
    ret_all = struct.unpack('id11s', bin_buf_all)
    print(bin_buf_all, '  <====>  ', ret_all)
    

    demo5:常用方法

    # 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)
    string = struct.pack(fmt, v1, v2, ...)
    
    # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
    tuple = unpack(fmt, string)
    
    # 计算给定的格式(fmt)占用多少字节的内存
    offset = calcsize(fmt)

    手册

    格式化字符串的存储部分

    从表中可以发现如下规律:

    • 整数类型b、h、i、q分别表示1个字节、2个字节、4个字节、8个字节,对应的大写字母表示无符号整数
    • f、d表示float和double
    • c表示字符、s表示字符串,需要注意:struct模块并不能直接将str类型转为bytes,当format为c和s时,对象需要是byte类型或者bytes类型
    FormatC TypePython字节数
    x pad byte no value 1
    c char string of length 1 1
    b signed char integer 1
    B unsigned char integer 1
    ? _Bool bool 1
    h short integer 2
    H unsigned short integer 2
    i int integer 4
    I unsigned int integer or lon 4
    l long integer 4
    L unsigned long long 4
    q long long long 8
    Q unsigned long long long 8
    f float float 4
    d double float 8
    s char[] string 1
    p char[] string 1
    P void * long  

    格式化字符串的控制部分

    • @表示默认,一切以本地为主
    • =表示对象的大小使用标准大小
    • <>表示小头序和大头序
    • 永远不会用到,可以忽略
    CharacterByte orderSize and alignment
    @ native native 凑够4个字节
    = native standard 按原字节数
    < little-endian standard 按原字节数
    > big-endian standard 按原字节数
    ! network (= big-endian) standard 按原字节数

    #参考资料 [monitor1379](http://www.jianshu.com/p/5a985f29fa81)

  • 相关阅读:
    js Dom为页面中的元素绑定键盘或鼠标事件
    javascript中DOM获取和设置元素的内容、样式及效果
    第四十一节 固定在顶部的悬停菜单
    第四十节 定位练习
    第三十九节 层级定位
    第三十八节 固定定位
    第三十七节 绝对定位
    第三十六节 相对定位
    第三十五节 定位
    第三十四节 新闻标题练习
  • 原文地址:https://www.cnblogs.com/lincappu/p/12620544.html
Copyright © 2020-2023  润新知