zoukankan      html  css  js  c++  java
  • python cookbook第三版学习笔记八:解析码流

    Binascii模块
    通过名字很容易知道这个模块的作用,binary, ascii。两个字母的合成,也就是二进制和ascii的转换模块
    下面先介绍下字母的ascii码
    a-z的ascii是从97-122. A-Z的ascii是从65-90,,0-9的ascii是48-57
    假设字符串为abc,那么对应的ascii码就是97,98,99,对应的十六进制则是61,62,63。b2a_hex就是ascii码的16进制表示。 a
    s='abc'
    print
    binascii.b2a_hex(s)
     
    E:python2.7.11python.exe E:/py_prj/python_cookbook.py
    616263
     
     
    s='abc'
    ret=binascii.b2a_hex(s)
    print binascii.a2b_hex(ret)
    a2b_hex则会将16进制的ascii码转换成字符串
    E:python2.7.11python.exe E:/py_prj/python_cookbook.py
    abc
     
    struct模块
    这个模块和C语言中的struct结构基本是一个原理。如下的这个结构体,有三个字段:一个整型的type,一个字符类型的str,一个浮点数的value.
    Struct
    {
      int type;
      char *str;
      float value; 
    }
    如果我们要封装在内存中进行传输,只需要memcpy就可以实现了
    那么在python中的struct模块就是起到类似的作用的。代码如下。我们同样复用上面的结构体,元组里面分别是int, string,float。Struct('I3sf')其实是表明数据的结构.这里i代表int,s代表string,f代表float。这里有3s代表3个字符
    values=(1,'abc',2.7)
    s=Struct('I3sf')
    print s.size
    packed_data=s.pack(*values)
    print s.unpack(packed_data)
     
    执行结果如下: size为12个字节,因为int和float分别占据4个字节,s占据一个字节,3s则是3个字节。但是从下面的运行结果来看。Size的大小是12字节,和4+3+4=11不符合。这是由于字节对齐的原则。f是4个字节。起始地址需要是4的倍数。因此在3s后面填充了一个字节。因此是12个字节。
    E:python2.7.11python.exe E:/py_prj/python_cookbook.py
    12
    (1, 'abc', 2.700000047683716)
     
    如果改成s=Struct('if3s')。这样就不存在字节对齐的原则,因此大小就是11字节。
    格式字符的意义以及大小参加下表

    从上面的例子可以看到pack和unpack分别是打包和解包的功能。如果在struct中设置的包格式不对,解包的时候会如何呢。比如代码改成如下,struct为if3s,也就是整数,浮点数,字符
    values=(1,'abc',2.7)
    s=Struct('if3s')
    print s.size
    packed_data=s.pack(*values)
    print s.unpack(packed_data)
    会报下面的错误,提示解析到第二个数也就是abc的时候不是一个浮点数。因此struct中格式的顺序一定要准确。
    Traceback (most recent call last):
      File "E:/py_prj/python_cookbook.py", line 297, in <module>
        packed_data=s.pack(*values)
    struct.error: required argument is not a float
    如果代码继续改成如下的形式,isf。也就是中间只有1个字符
    values=(1,'abc',2.7)
    s=Struct('isf')
    print s.size
    packed_data=s.pack(*values)
    print s.unpack(packed_data)
    结果如下,可以看到只有a被解析出来了,因为格式中只有1个字节。因此只解析了一个字节的数据。
    E:python2.7.11python.exe E:/py_prj/python_cookbook.py
    12
    (1, 'a', 2.700000047683716)
     
    另外补充一点对于底层来说,字节的顺序分为大端序(高端在前)和小端序(低端在前)。Struct('<isf')代表小端序,Struct('>isf')代表大端序。
     
    
    
  • 相关阅读:
    laravel 安装完成后安装 vendor 目录
    requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement
    查看laravel版本
    git update-index --assume-unchanged
    Git 取消跟踪已版本控制的文件(亲测可行)
    git把某个文件去除版本控制
    git如何移除某文件夹的版本控制
    git如何移除某文件的版本控制
    git 教程
    Git branch && Git checkout常见用法
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/7150843.html
Copyright © 2011-2022 走看看