返回顶部
首页 > 资讯 > 后端开发 > Python >用struct模块实现python so
  • 155
分享到

用struct模块实现python so

模块structpython 2023-01-31 05:01:28 155人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

最近跳槽到西安一家机器人公司,我们的产品属于教育机器人的范畴,为了增强客户吸引力,引进了一个智能家居公司的产品api接口,让机器人来操作智能家居 该公司的智能家居API是自定义tcp包,即直接在TCP头后面写自定义数据结构: 客户端请求

最近跳槽到西安一家机器人公司,我们的产品属于教育机器人的范畴,为了增强客户吸引力,引进了一个智能家居公司的产品api接口,让机器人来操作智能家居


该公司的智能家居API是自定义tcp包,即直接在TCP头后面写自定义数据结构

客户端请求下载 家具数据库 的格式

命令字(4字节,小端)

0x4c

服务器返回请求结果 的格式

命令字(4字节,小端) payload长度(4字节,小端) payload(N*1字节)
0x43 11262(尺寸很大) sqlite数据库


默认python Socket只能收发字符串,需要借助struct才能收发二进制数据


发送请求

cmd_Word = 0x4c
tx_buf = struct.pack('<I', cmd_word)
sock.sendall(tx_buf)

tx_buf据struct的文档说是其对输入编码生成的字符串,用type(tx_buf)显示确实是<type 'str'>,print tx_buf显示字母L

但len(tx_buf) == 4, print repr(tx_buf)显示

'L\x00\x00\x00'

也就是说len('L\x00\x00\x00') == 4

对于从C语言转过来的人来说,上面情况真是理解不能,但它就是发送成功了


接收应答

fp = open('house.db', 'wb+')
recv_cnt = 0
while True:
    rx_buf = sock.recv(4096)
    len_buf = len(rx_buf)
    if len_buf ==0:
        break
    if recv_cnt == 0:
        cmd_word, data_len_total = struct.unpack(rx_buf[0:8])
        buf = buffer(rx_buf, 8, len_buf - 8)
        fp.write(buf)
    else:
        buf = buffer(rx_buf)
        fp.write(buf)
    recv_cnt = recv_cnt +1

注意:

0、接收自定义帧头时用unpack,可以获得结构体各字段取值

1、接收自定义帧内容(字节流)时不用unpack,因为unpack返回的是tuple,而write不支持tuple类型

2、因为是二进制写入,所以必须将str转成buffer类型

3、二进制数据很大时,底层会拆分成多个以太网帧,如果你sendall后马上recv,则可能只收到1448字节,不要担心,这是因为你recv时内核协议栈只有一帧这么多数据,它全部返回给你了,满足socket编程的标准








--结束END--

本文标题: 用struct模块实现python so

本文链接: https://lsjlt.com/news/188709.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 用struct模块实现python so
    最近跳槽到西安一家机器人公司,我们的产品属于教育机器人的范畴,为了增强客户吸引力,引进了一个智能家居公司的产品API接口,让机器人来操作智能家居 该公司的智能家居API是自定义TCP包,即直接在TCP头后面写自定义数据结构: 客户端请求...
    99+
    2023-01-31
    模块 struct python
  • 使用Python模块:struct模块
    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)——我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) 1)bytes、str...
    99+
    2023-01-31
    模块 Python struct
  • python struct模块
    一、简介   了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int, char, bool等等),方便对某一结构对象进行处理。而在网络通信当中,大多传递的数据是以二进制流(binar...
    99+
    2023-01-31
    模块 python struct
  • Python struct模块-深入学习
    Python struct模块 用处struct模块中的函数格式化字符串 对齐方式格式符code使用示例Python参考手册struct模块链接 转载请标明出处(http://blog.csdn.net/lis_12/a...
    99+
    2023-01-31
    模块 Python struct
  • python3中的struct模块使用
    软硬件环境python3struct简介struct是python(包括版本2和3)中的内建模块,它用来在c语言中的结构体与python中的字符串之间进行转换,数据一般来自文件或者网络。常用方法struct模块中的函数函数returnex...
    99+
    2023-01-31
    模块 struct
  • Python使用Paramiko模块实现
    paramiko是用python写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输以及远程命令执行。 通过安装包安装: wget ...
    99+
    2023-01-31
    模块 Python Paramiko
  • Python paramiko模块(实现
    开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 安装paramiko模块 pip3 install paramiko 基于用户密码方式 import paramiko # 创建...
    99+
    2023-01-31
    模块 Python paramiko
  • Python如何实现模块和加载模块
    这篇文章主要介绍Python如何实现模块和加载模块,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入...
    99+
    2023-06-08
  • python的requests模块实现登
    51cto用python的requests模块实现登陆示例代码如下: -- coding:utf-8 --import requestsimport re client = requests.session()agent = "Mozill...
    99+
    2023-01-31
    模块 python requests
  • Python使用pytorch动手实现LSTM模块
    LSTM 简介: LSTM是RNN中一个较为流行的网络模块。主要包括输入,输入门,输出门,遗忘门,激活函数,全连接层(Cell)和输出。 其结构如下: 上述公式不做解释,我们只要...
    99+
    2024-04-02
  • python 模块argparse用法实
     argparse是python内置模块,用于快速创建命令行。有一个第三方模块Click也可以实现这个功能,两者各有优缺点,看个人需求吧。官方网页https://docs.python.org/3.5/library/argparse.ht...
    99+
    2023-01-31
    模块 python argparse
  • gettext模块实现Python国际化
    1.gettext模块介绍gettext模块为Python模块和应用程序提供国际化(i18n)和本地化(l10n)服务。它提供两套API,一套高层的类似于GNU gettext的API和一套基于类的API。前者适用于单语言的场景,并且语言的...
    99+
    2023-01-31
    模块 gettext Python
  • 怎么用Python实现强大的 logging 模块
    本篇内容介绍了“怎么用Python实现强大的 logging 模块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • Python利用filestools模块实现水印添加
    在前面的文章中很早有写到关于添加水印的方法,但是过程还是较为复杂,最近发现的这款filestools非标准库其实真正实现添加水印的只要一个函数的调用,一行代码即可完成水印的添加。 通...
    99+
    2024-04-02
  • Python模块怎么实现简单的调用
    这篇文章给大家分享的是有关Python模块怎么实现简单的调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通...
    99+
    2023-06-14
  • Python利用sched模块实现定时任务
    目录牛刀小试进阶使用在固定时间执行任务执行多个任务以不同的优先级执行不同的任务定时任务加上取消方法执行备份程序执行定时分发邮件的程序今天我们来介绍一下Python当中的定时任务,主要...
    99+
    2023-05-14
    Python sched实现定时任务 Python sched定时任务 Python 定时任务 Python sched
  • Python中如何使用re模块实现okenizer
    这篇文章主要介绍“Python中如何使用re模块实现okenizer”,在日常操作中,相信很多人在Python中如何使用re模块实现okenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中...
    99+
    2023-06-30
  • Python怎么用re模块实现简易tokenizer
    这篇文章主要介绍“Python怎么用re模块实现简易tokenizer”,在日常操作中,相信很多人在Python怎么用re模块实现简易tokenizer问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pytho...
    99+
    2023-06-30
  • python跨模块调用变量怎么实现
    Python中,要实现跨模块调用变量,可以使用以下方法: 使用全局变量:在一个模块中定义一个全局变量,其他模块可以直接引用该全局变...
    99+
    2023-10-27
    python
  • golang 实现模块
    Golang 是一门在业界越来越受欢迎的编程语言,其简洁、高效、安全的特性使其在不同应用场景中都具有很高的效益。随着项目越来越庞大,代码的组织和管理也变得越来越复杂。在这种情况下,使用模块来组织和管理代码,可以大大提高代码的可维护性和可复用...
    99+
    2023-05-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作