Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用struct模块实现python so

用struct模块实现python so

作者头像
py3study
发布于 2020-01-07 11:37:17
发布于 2020-01-07 11:37:17
62200
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

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

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

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

命令字(4字节,小端)

0x4c

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

命令字(4字节,小端)

payload长度(4字节,小端)

payload(N*1字节)

0x43

11262(尺寸很大)

sqlite数据库

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

发送请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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语言转过来的人来说,上面情况真是理解不能,但它就是发送成功了

接收应答

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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编程的标准

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
pkg文件--一种简单的游戏资源打包格式
[四字节] 固定的内容, 值不重要  [四字节] 文件数目(unsigned int)  [四字节] 文件名表 的偏移(unsigned int)  [四字节] 文件名表 的长度(字节数)(unsigned int)  ……  中间一堆 各个文件的内容, 文件内容使用zlib压缩过  ……  直到  文件名表:  [两字节] 文件名长度  [文件名长度那么多字节] 文件名  [四字节] 固定的内容,值不重要  [四字节] 文件原长度  [四字节] 文件偏移  [四字节] 文件压缩后的长度  [两字节] 又一个文件名的长度  …
用户7886150
2020/11/23
2.2K0
python网络-TFTP客户端开发(25)
TFTP(Trivial File Transfer Protocol,简单文件传输协议)
Se7eN_HOU
2019/09/11
2.4K0
python网络-TFTP客户端开发(25)
2018-06-30 Python Struct
Python使用struct处理二进制 例如: import struct a = 20 b = 400 s = struct.pack('ii', a, b) print(s, type(s)) #输出:b'\x14\x00\x00\x00\x90\x01\x00\x00' print('length: ', len(s)) #输出:length:  8 s2 = struct.unpack('ii', s) print(s2) #输出:(20, 400) s2 = struct.unpack('ii',
用户1733354
2018/07/05
5400
31_网络编程-struct
   我们可以借助一个模块,这个模块可以把要发送的数据长度转换成固定长度的字节。这样客户端每次接收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么最终接受的数据只要达到这个值就停止,就能刚好不多不少的接收完整的数据了。
py3study
2020/01/19
4550
51单片机对无线模块nRF24L01简单的控制收发程序
这段代码主要先看全局变量,通过对IO口的赋值(如按键、led、无线模块的端口CE/IRQ等)可以知道电路图的绘制。
啊源股
2019/09/11
2.6K0
Linux驱动开发-编写W25Q64(Flash)驱动
W25Q64是一颗SPI接口的Flash存储芯片,是华邦W25QXX系列里的一个具体型号,这个系列里包含了W25Q16,W25Q32,W25Q64,W5Q128等等。编程代码逻辑都差不多,主要是容量的区别。
DS小龙哥
2022/04/08
2.4K0
Linux驱动开发-编写W25Q64(Flash)驱动
粘包现象
让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig)
超蛋lhy
2018/08/31
7190
粘包现象
Python之黏包的解决
黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候,发送的长度和接收的长度不匹配的情况下就
新人小试
2018/04/12
8480
Python之黏包的解决
详解串行通信协议及其FPGA实现(二)
基于Verilog实现标准串口协议发送8位数据:起始位 + 8位数据位 + 校验位 + 停止位 = 11位,每1位的时间是16个时钟周期,所以输入时钟应该为:波特率*16,带Busy忙信号输出。实现方法比较简单,数据帧的拼接、计数器计时钟周期,每16个时钟周期输出一位数据即可。
单片机点灯小能手
2020/07/16
7680
Python学习——struct模块的pack、unpack示例
[work@db-testing-com06-vm3.db01.baidu.com python]$ python struct_pack.py
阳光岛主
2019/02/20
2.2K0
Python中struct.pack()和struct.unpack()用法
python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~。一般输入的渠道来源于文件或者网络的二进制流。
周小董
2019/03/25
16.6K2
Python中struct.pack()和struct.unpack()用法
剖析和解决Python中网络粘包的正确姿势
先来看一个案例,单进程启动一个tcp socket通信,从服务端发送两次数据到客户端。
仙人技术
2020/04/29
6690
Python基础之:struct和格式化字符
文件的存储内容有两种方式,一种是二进制,一种是文本的形式。如果是以文本的形式存储在文件中,那么从文件中读取的时候就会遇到一个将文本转换为Python中数据类型的问题。实际上即使是文本的形式存储,存储的数据也是也是有结构的,因为Python底层是用C来编写的,这里我们也称之为C结构。
程序那些事
2021/04/16
9330
面向对象之套接字(socket)和黏包
 一丶套接字(socket)   tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端   基于UDP协议的socket   server端: import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 udp_sk.bind(('127.0.0.1',9000)) #绑定服务器套接字 msg,addr = udp_sk.recvfrom(1024) print(msg) udp_sk.s
py3study
2020/01/19
5950
面向对象之套接字(socket)和黏包
firefly-rk3288开发板Linux驱动——W25Q32 SPI驱动
Linux下的spi驱动和i2c驱动十分类似,也可以分为三个部分:SPI核心,spi主机控制器(i2c中叫做i2c适配器),spi设备。
知否知否应是绿肥红瘦
2025/02/19
960
简单实现Socks5代理(Python&
只实现了CONNECT功能 参考:点击打开链接 Python版: import socket import threading import select import time IsNeedAuth=False Username='admin' Password='123456' Port=7456 def prxoy(sock,address): cs = sock DspPort=0 DspAddr='' try: recv= cs.r
py3study
2020/01/13
1.9K0
Python之struct
  (3) 处理二进制数据,如果用struct来处理文件的话,需要用‘wb’/’rb’以二进制写,读的方式来处理文件
全栈程序员站长
2022/07/14
4960
python3-socket黏包现象
黏包原因(怎么形成的)---->只有TCP协议有黏包现象,UDP协议永远不会黏包
py3study
2018/08/02
5570
Python tcp socket 传送
【测试环境】 os:Windows 10 x64 Python:3.6.3 【server.py】 #encoding: utf-8 #author: walker #date:  2017-12-01  #summary: 用socket创建tcp server以接收文件  import os, time import socket import struct cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__)) Host = 
py3study
2020/01/06
4670
学员学习笔记分享:FPGA之HDMI、以太网篇
高清多媒体接口(High Definition Multimedia Interface)是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。HDMI可用于机顶盒、DVD播放机、个人计算机、电视、游戏主机、综合扩大机、数字音响与电视机等设备。HDMI可以同时发送音频和视频信号,由于音频和视频信号采用同一条线材,大大简化系统线路的安装难度。
FPGA技术江湖
2023/04/03
6910
学员学习笔记分享:FPGA之HDMI、以太网篇
相关推荐
pkg文件--一种简单的游戏资源打包格式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档