实际应用场景

python客户端与服务端(c程序)进行通讯,需接收服务端发来的16进制码流,并对16进制数据进行解码,得到相应字段的数据,并可以将数据打包成对应格式的码流发送给服务端,多字节整数传输采用网络字节序。

1.1 网络字节序

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端)排序方式。

为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下

Character Byte order Size Alignment

@(默认) 本机 本机 本机,凑够4字节

= 本机 标准 none,按原字节数

< 小端 标准 none,按原字节数

> 大端 标准 none,按原字节数

! network(大端) 标准 none,按原字节数

1.2 python struct的模块

作用:按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送;

按照指定格式将字节流转换为Python指定的数据类型;

处理二进制数据,如果用struct来处理文件的话,需要用’wb’,’rb’以二进制(字节流)写,读的方式来处理文件;

处理c语言中的结构体;

struct中两个重要的函数:

(1)pack(fmt,v1,v2…):打包函数

返回值类型:string

按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回.

(2)unpack(fmt,v1,v2…..):解包函数

返回值类型:tuple

按照给定的格式(fmt)解析字节流,并返回解析结果

2.消息发送的格式

消息采用消息头+消息体格式。

UINT8 1字节 8位无符号整形

UINT16 2字节 16位无符号整形

UINT32 4字节 32位无符号整形

UINT64 8字节 64位无符号整形

1.消息头

字段 类型 说明

消息编号 UINT8 -

保留 UINT8 用0填充

消息体长度 UINT16 不包括消息头的长度,范围:0 -- 65535

1.1消息编号

编号 消息 用途 说明

0xe1 W_HEARTBEAT 心跳消息 消息体长度为0

0xq1 QUERY_SM 查询SM请求 消息体长度为0

0xq2 QUERYSM_RPT 查询SM数据上报

0xs1 SCAN_PL 扫描PL请求 消息体长度为0

0xs2 SCANPL_ACK 扫描PL请求应答

1.2消息体格式

(1)心跳消息(W_HEARTBEAT) 每30秒发送一次,无消息体

(2)QUERY_SM 查询SM数据请求 无消息体

(3)QUERYSM_RPT 查询SM数据应答 消息体长度为27

字段 长度 类型 说明

reserved 6 CHAR ——

strName 16 CHAR 字符串

RS 4 INT32 信号强度(-140~-44dBm)

0:RS值无效

Rs_si 1 BYTE 0:SI

1:RS

(4)SCAN_PL 扫描PL请求 消息体长度为0

(5)SCANPL_ACK 扫描PL请求应答

字段 长度 类型 说明

reserved 4 UINT32 ——

result 2 UINT16 0:成功,1:失败

count 2 UINT16 info数量

info 13 * 10 info[10] 最多10个info列表

5-1) info消息体

字段 长度 类型 说明

ID 4 UINT32 ID值

Num 6 CHAR 号码

fn 2 UINT16 fn频率

power 1 UINT8 功率

3.代码示例如下

3.1 发送程序(打包程序):

def th_heart():

while True:

logging.info('SEND W_HEARTBEAT')

cmd_word = 0xe1

tx_buf = struct.pack('

ModuleSocket.sendto(tx_buf, ('192.168.1.209', 2843))

time.sleep(60)

def send_query_sm(id):

header = 0xq1

b = 0

b_len = 0

body = struct.pack("<2BH", header, b, b_len)

send_msg(id, body)

def send_scan_pl(id):

header = 0xs1

b = 0

b_len = 0

body = struct.pack("<2BH", header, b, b_len)

send_msg(id, body)

def send_msg(id,body):

addr = (192.168.1.209,2843)

ModuleSocket.sendto(body, addr)

msg = repr(body)

logging.info('send serial %s to %s' % (msg, addr))

3.2 接收程序(解包程序):

if temp.find('0xq2') >=0:

logging.info('QUERYSM_RPT')

header,b,b_len,reserved,strName,RS,Rs_si = struct.unpack(">2BH6s16siB", body)

strName = strName[0:-1]

logging.info("header:%s, b:%s, b_len:%s,reserved:%s, strName:%s, RS:%s, Rs_si:%s" % (header, b, b_len, reserved, strName, RS, Rs_si))

sm_rpt(moduleId, strName)

if temp.find('0xs2') >= 0:

logging.info('SCANPL_ACK')

header, b, b_len, reserved, result, count = struct.unpack(">2BHIHH", body[0:12])

ID,Num,fn,power = struct.unpack(">I6sHB", body[12:25])

logging.info("reserved:%s, result:%s, count:%s" %(reserved,result,count))

logging.info("ID:%s, Num:%s, fn:%s, power:%s" % (ID, Num, fn, power))

pl_rpt(moduleId, ID, Num,fn,power)

python16进制字节序_Python-十六进制数据传递与接收相关推荐

  1. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

    第 1 章 套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字 ...

  2. ASCII字符和16进制字节数据互转

    接着上次写的一个字符转换.这次是互转,更便于理解. 1.CharToHex() //功能描述:把ASCII字符转换为16进制 将两个ASCII字符转化为单个字节进行显示,即两个字节转化为一个字节.如' ...

  3. 针对文字加密的简单 JS 加密算法 --进制乱序法改良版

    在上一篇文章<普通 http 网络下数据的安全传输(设计原理)>中,我曾经推荐浏览器和服务器之间的加密通讯宜采用<几个文字加密的 JS 简洁算法(续2)--进制乱序法>中提及的 ...

  4. 将时间转换为16进制字符串或16进制小端模式byte数据

    1.将String类型的时间转换 1>String类型时间转换为Date类型的时间 2>时间转换为时间戳 3>时间戳转换为16进制字符串 4>16进制字符串转换为16进制小端模 ...

  5. 字符串转16进制字节数组,字节数组转16进制字符串

    /// <summary>/// 字符串转16进制字节数组/// </summary>/// <param name="hexString">& ...

  6. 手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(下)

    手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(上) Unicode 先讲讲这个东西的规则 Unicode 通常(不是所有)用两个字节来表示 一个字符 ...

  7. Qt进制转换(十进制转十六进制)

    Qt进制转换 十进制转十六进制 转化方法如下: int x =10;unsigned int ux = x;QString xVal = QString::number(ux, 16);//得到十六进 ...

  8. python16进制转10进制_python 字节串及10进制,16进制相关转换

    进行协议解析时,总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等 整数之间的进制转换: 10进制转16进制: hex(16) ==> 0x10 16进制转10进制: in ...

  9. python进制表示方法_python 16进制表示什么

    十六进制是由0 ~ 15组成的,可是9后面的10是用字母来代替A~ F,也就是0 ~ F,用字母代替了数字,避免不再重复. python也内置了一个数字转16进制的方法,如: hex() : 将任意数 ...

最新文章

  1. javascript搜索框联想搜索_js实现输入框联想搜索
  2. 微软Hololens设备 浅分析
  3. c语言增强图像直方图均衡化,图像直方图均衡化增强opencv与C语言版
  4. 【图解漏洞】图解跨站请求伪造(CSRF)原理
  5. macos sierra怎么升级到catalina_Mac os 下 Pyhon 库老是安装失败?
  6. 把txt格式数据制作成xml数据
  7. c fun函数求n个整数的平均值_OOP 面向对象编程:由 C 到 C++
  8. PAIP.java程序调试的注意点及流程总结
  9. 数字水印--给我的文件充当保护神
  10. STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
  11. 1467:Radio Transmission(KMP最小循环节)
  12. 考研数学易错知识点总结
  13. 行业标准 | 证券期货业信息系统运维管理规范 JR/T 0099—2012
  14. Ground truth 在计算机方面的意思
  15. 95后能拯救结婚行业吗?《2018美团点评结婚行业蓝皮书》发布
  16. 超越光速:时间旅行不是梦
  17. 502 bad gateway这是什么意思_2020年11月11日将出现“水星西大距”,这是什么意思?...
  18. 小程序富文本图片放大功能
  19. 传感器分类大全_莫韵乐的知识拓展系列
  20. 看c++primer知识点总结(基础部分)

热门文章

  1. using namespace cv
  2. Hibernate占位符?和:及JPA
  3. (1)什么是socket(套接字)
  4. python3-字符串常用操作
  5. 路飞学城-Python开发集训-第2章
  6. 今天执行grep命令差点把服务器搞崩
  7. Direct3D11学习:(二)基本绘图概念和基本类型
  8. struts2 javaweb 过滤器、监听器 拦截器 原理
  9. 数据结构-1-顺序表的实现
  10. R - 变化plot字形,嵌入字体以pdf