python模块Struct

March 18, 2019 Python学习 访问: 62 次

python和其他语言之间的类型转换处理器!

介绍

在python中,对于数据类型的表示,只定义了六中基本类型:字符串、整型、浮点型、元组、列表、字典。当python与其他平台或者是语言之间的类型进行交互的时候,就必须将这些数据类型转换成和交互方一样的数据类型。
比如说,当C++写的客户端发送一个int型(4字节)变量的数据到Python写的服务器,Python接受到表示这个证书的4个字节的数据,怎么解析成Python认识的整数呢?那么就用到了Python中的标准模块struct来解决这个问题。

help(struct)

Help on module struct:
NAME
    struct
FILE
    /usr/lib/python2.7/struct.py
MODULE DOCS
    https://docs.python.org/library/struct
DESCRIPTION
    Functions to convert between Python values and C structs represented
    as Python strings. It uses format strings (explained below) as compact
    descriptions of the lay-out of the C structs and the intended conversion
    to/from Python values.
    The optional first format char indicates byte order, size and alignment:
      @: native order, size & alignment (default)
      =: native order, std. size & alignment
      <: little-endian, std. size & alignment
      >: big-endian, std. size & alignment
      !: same as >
    The remaining chars indicate types of args and must match exactly;
    these can be preceded by a decimal repeat count:
      x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
      ?: _Bool (requires C99; if not available, char is used instead)
      h:short; H:unsigned short; i:int; I:unsigned int;
      l:long; L:unsigned long; f:float; d:double.
    Special cases (preceding decimal count indicates length):
      s:string (array of char); p: pascal string (with count byte).
    Special case (only available in native format):
      P:an integer type that is wide enough to hold a pointer.
    Special case (not in native mode unless 'long long' in platform C):
      q:long long; Q:unsigned long long
    Whitespace between formats is ignored.
    The variable struct.error is an exception raised on errors.
CLASSES
    exceptions.Exception(exceptions.BaseException)
        error
    class error(exceptions.Exception)
     |  Method resolution order:
     |      error
     |      exceptions.Exception
     |      exceptions.BaseException
     |      __builtin__.object
     |
     |  Data descriptors defined here:
     |
     |  __weakref__
     |      list of weak references to the object (if defined)
     |
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.Exception:
     |
     |  __init__(...)
     |      x.__init__(...) initializes x; see help(type(x)) for signature
     |
     |  ----------------------------------------------------------------------
     |  Data and other attributes inherited from exceptions.Exception:
     |
     |  __new__ = <built-in method __new__ of type object>
     |      T.__new__(S, ...) -> a new object with type S, a subtype of T
     |
     |  ----------------------------------------------------------------------
     |  Methods inherited from exceptions.BaseException:
     |
     |  __delattr__(...)
     |      x.__delattr__('name') <==> del x.name
     |
     |  __getattribute__(...)
     |      x.__getattribute__('name') <==> x.name
     |
     |  __getitem__(...)
     |      x.__getitem__(y) <==> x[y]
     |
     |  __getslice__(...)
     |      x.__getslice__(i, j) <==> x[i:j]
     |
     |      Use of negative indices is not supported.
     |
     |  __reduce__(...)
     |
     |  __repr__(...)
     |      x.__repr__() <==> repr(x)
     |
     |  __setattr__(...)
     |      x.__setattr__('name', value) <==> x.name = value
     |
     |  __setstate__(...)
     |
     |  __str__(...)
     |      x.__str__() <==> str(x)
     |
     |  __unicode__(...)
     |
     |  ----------------------------------------------------------------------
     |  Data descriptors inherited from exceptions.BaseException:
     |
     |  __dict__
     |
     |  args
     |
     |  message
FUNCTIONS
    calcsize(...)
        Return size of C struct described by format string fmt.
    pack(...)
        Return string containing values v1, v2, ... packed according to fmt.
    pack_into(...)
        Pack the values v1, v2, ... according to fmt.
        Write the packed bytes into the writable buffer buf starting at offset.
    unpack(...)
        Unpack the string containing packed C structure data, according to fmt.
        Requires len(string) == calcsize(fmt).
    unpack_from(...)
        Unpack the buffer, containing packed C structure data, according to
        fmt, starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt).

从中我们可以提取出来几条重要的信息:

  1. DESCRIPTION:
    大概翻译过来的意思就是为了在python和C、C++等语言结构之间数据类型的转换

  2. 字节对齐方式

character Byte order Size Alignment
@ (默认) 本机 本机 本机,凑够4字节
= 本机 标准 none,按原字节数
< 小端 标准 none,按原字节数
> 大端 标准 none,按原字节数
! network(大端) 标准 none,按原字节数
  1. 格式符(fmt)

  2. 函数

函数名 return 函数作用
pack(fmt,v1,v2...) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回
pack_into(fmt,buffer,offset,v1,v2...) none 和第一个差不多,增加了一个可以讲格式化过的字符串写入缓存区buffer中
unpack(fmt,v1,v2,...) 元组 按照给定的格式(fmt)解析字节流,并返回解析结果
pack_from(fmt,buffer,offset) 元组 按照给定的格式解析以offset开始的缓冲区,并返回解析结果
calcsize(fmt) size of fmt 计算给定的格式占用多少字节的内存,需要注意的是对其方式

具体例子

pack:

from struct import *
print pack("<hhl",1,2,3).encode("hex")
out:
0100020003000000

unpack:

from struct import *
print unpack("<hhl","\x01\x00\x02\x00\x03\x00\x00\x00")
out:
(1, 2, 3)

calcsize:

from struct import *
print calcsize("<hhl")

添加新评论