zoukankan      html  css  js  c++  java
  • python 中的struct

    本文简单讲述python怎么生成和使用像C中的结构体

    先上代码

    # im_netio.py
    import socket
    import struct
    
    # server address
    host = "172.16.100.136"
    port = 8100
    # head
    head_len = 12
    version = 6
    
    def im_connect():
        s = socket.socket()
        s.connect((host, port))
        return s
    
    def im_send(sock, pack):
        head = struct.pack('iii', head_len, len(pack), version)
        sock.send(head)
        plen = sock.send(pack)
        f = open('netio.txt', 'a')
        f.write('send:')
        f.write(pack)
        f.write('\n')
        f.close()
    
    def im_recv(sock):
        buf = sock.recv(12)
        hlen, plen, version = struct.unpack('iii', buf)
        backlen = plen
        while plen > 0:
            buf = sock.recv(plen)
            plen -= len(buf)
        f = open('netio.txt', 'a')
        f.write('recv:')
        f.write(buf)
        f.write('\n')
        f.close()
        return buf

    封装了三个函数 im_connect im_send im_recv;

    im_send先发送了一个包头,再发送数据,并将发送的内容(不包括包头)保存进本地文件。

    实际上,包头就是C中的一个结构体:

    struct pack_head_st
    {
        // 自身长度
        size_t              size;
        // 紧跟在自身后面的数据长度
        size_t              len;
        // 版本
        size_t              version;
    }pack_head_t;
    head = struct.pack('iii', head_len, len(pack), version)
    struct.pack就是将第一个参数之后的参数打包成一个结构体,格式就是第一个参数中的'iii',意为将三个int类型变量存进一个结构体,并返回为head。
    然后发送,这个不用说了。

    im_recv中,使用了struct.unpack,即struct.pack相对的解包函数。
    打包与解包的格式如下表
    FormatC TypePython typeStandard sizeNotes
    x pad byte no value    
    c char string of length 1 1  
    b signed char integer 1 (3)
    B unsigned char integer 1 (3)
    ? _Bool bool 1 (1)
    h short integer 2 (3)
    H unsigned short integer 2 (3)
    i int integer 4 (3)
    I unsigned int integer 4 (3)
    l long integer 4 (3)
    L unsigned long integer 4 (3)
    q long long integer 8 (2), (3)
    Q unsigned long long integer 8 (2), (3)
    f float float 4 (4)
    d double float 8 (4)
    s char[] string    
    p char[] string    
    P void * integer   (5), (3)
     
  • 相关阅读:
    Git :版本控制工具进阶
    Git 提交本地代码
    Git创建代码仓库
    Git
    SQLlite数据库的增删改查
    Android学习第十天
    Android学习第九天
    Android学习第八天
    Android学习第七天
    【k8s】Deployment
  • 原文地址:https://www.cnblogs.com/jogger/p/2654376.html
Copyright © 2011-2022 走看看