zoukankan      html  css  js  c++  java
  • Python模块struct(二进制数据服务)

    struct模块

    Python没有专门处理字节的数据类型。但由于b'str'可以表示字节,所以,字节数组=二进制str。

    而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。

    在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的bytes,你得配合位运算符这么写:

    >>> n = 10240099
    >>> b1 = (n & 0xff000000) >> 24
    >>> b2 = (n & 0xff0000) >> 16
    >>> b3 = (n & 0xff00) >> 8
    >>> b4 = n & 0xff
    >>> bs = bytes([b1, b2, b3, b4])
    >>> bs
    b'x00x9c@c'

    解释:

    10240099是十进制数字,转化为2进制数字有24位(3个字节)。想把它用字节串表示,可以使用bytes()方法,但是bytes()指接收1个字节以内的十进制数字,即0~255。所以要把10240099分解为3部分,每部分一个字节,然后用bytes()求每个字节的字节串,最后再组装起来。很麻烦,具体见上面的代码。

    说明:

    b2 = (n & 0xff0000) >> 16   #位运算符号&,和右移运算符>>的作用:提取10240099的右边的8位字符。

     10240099 & 0xff0000 ,位与,只有都是有1,才得1

    1001 1100 0100 0000 0110 0011
    1111 1111 0000 0000 0000 0000
    ----------------------------------------&
    1001 1100 0000 0000 0000 0000

     然后对得到的数右移>>16, 得到10011100。这就相当于从10240099中提取了从左边开始的8bit数字。

    struct

    解决bytes和其他二进制数据类型的转换。

    >>> import struct
    >>> struct.pack('>I', 10240099)
    b'x00x9c@c'

    函数:

    struct.pack(formatv1v2...)

    参数:

    struct.unpack(formatbuffer)

    unpackbytes变成相应的数据类型:

    >>> struct.unpack('>IH', b'xf0xf0xf0xf0x80x80')
    (4042322160, 32896)

    本文参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080

  • 相关阅读:
    npm 安装卸载模块 & ionic插件安装与卸载
    Vue中v-model解析、sync修饰符解析
    Vue props用法详解
    vue页面跳转
    Swift 4 中的泛型
    Swift枚举的全用法
    蓝牙 BLE 三种 UUID 格式转换
    SVG图案
    SVG渐变
    SVG坐标系统及图形变换
  • 原文地址:https://www.cnblogs.com/chentianwei/p/11926404.html
Copyright © 2011-2022 走看看