python socket发送16进制数据_Python UDP Socket 16进制数据发送
注:此篇文章首次发表于我的一篇CSDN博客里边,现转载于此。
今天琢磨了一下Python UDP Socket 16进制数据发送。
原以为UDP发送和接受的都是字符,怎么能够发送16进制?但细想,其实接收的都是“010100101******”这样的东东。所有,要想发送16进制也是可以做到的。
要实现这个东东,就得用到字节byte,因为Python中没有字节(Byte)类型(可以把这里的字符串理解为字节流),所以得用到python的struct模块来进行字节流转换。
我的思路是这样子的:
1、首先假设有这样一个16进制字符串str: B1 C2 FF 82
2、利用python的字符数组符号分割字符串str,把字符串里面的16进制数据字符分割出来:“B1”, “C2″, “FF”,”82″;
3、通过函数int( s, 16)把16进制转换成整形数【函数里面s代表一个16进制字符串】;
4、利用python提供的struct模块里的struct.pack(fmt,v1, v2, …)函数把整形转换成字节流【具体知识请看附录】;
5、利用socket.sendto函数发送字节流。
【例子:部分重点代码】
C++
addr1 = ("192.168.1.100", "8000")
UDPSock = socket(AF_INET, SOCK_DGRAM)
str = "B1C2FF82" #获取字符测
str1 = "" #初始化
str2 = "" #初始化
while str:
str1 = str[0:2] #分割字符串,获取前两个字符
s = int( str1, 16) #字符串转换成16进制
str2 += struct.pack('B', s) #转换成字节流,“B“为格式符,代表一个unsigned char (具体请查阅struct)
str = str[2:] #分割字符串,去掉字符串前两个字符
while(1):
if(UDPSock.sendto(str2, addr1)):pass #UDP发送数据
UDPSock.close()
break
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
addr1=("192.168.1.100","8000")
UDPSock=socket(AF_INET,SOCK_DGRAM)
str="B1C2FF82"#获取字符测
str1=""#初始化
str2=""#初始化
whilestr:
str1=str[0:2]#分割字符串,获取前两个字符
s=int(str1,16)#字符串转换成16进制
str2+=struct.pack('B',s)#转换成字节流,“B“为格式符,代表一个unsigned char (具体请查阅struct)
str=str[2:]#分割字符串,去掉字符串前两个字符
while(1):
if(UDPSock.sendto(str2,addr1)):pass#UDP发送数据
UDPSock.close()
break
如此便可以实现UDP客户端的16进制发送。
【附录】
python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典。
但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话。
python提供了一个struct模块来提供转换。下面就介绍这个模块中的几个方法。
struct.pack():
struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。
其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息如下图所示,v1, v2, …表示要转换的python值。
下面的例子将两个整数转换为字符串(字节流):
>>> import struct
>>> a=20
>>> b=400
>>> str=struct.pack(‘ii’,a,b) #转换成字节流,虽然还是字符串,但是可以在网络上传输
>>> print len(str) #ii 表示两个int
8 #可以看到长度为8个字节,正好是两个int型数据的长度
>>> print str
#二进制是乱码
>>> print repr(str)
‘\x14\x00\x00\x00\x90\x01\x00\x00′ #其中十六进制的 0x00000014, 0x00001009分别表示20和400
>>>
由此我们就可以任意的进行组包了,比如下面一个打包的例子,只介绍其中的pack
format = “!HH%ds” % len(data)
buffer = struct.pack(format,opcode,blocknumber,data)
我们要对一个数据进行打包,加上一些个包头,我们根据下面的格式符信息,知道H是unsigned short是2个字节,而s是char型。所以这个buffer就是2个字节的opcode,2个字节的blocknumber,和len长的char。
函数:
struct.unpack():
我们接着上面的例子运行:
>>> a1,a2=struct.unpack(‘ii’,str)
>>> print ‘a1′,a1
a1 20
>>> print ‘a2=’,a2
a2= 400
可以看到 “ii”以四个字节为分界,把8个字节的str分成了两个int型的整数。
struct.calcsize():用来计算特定格式的输出的大小,是几个字节,比如:
>>> struct.calcsize(‘HH4s’)
8
>>> struct.calcsize(‘ii’)
8
>>>
>>> format=’!HH%ds’ % len(‘hello python’)
>>> struct.calcsize(format)
16
>>>
python socket发送16进制数据_Python UDP Socket 16进制数据发送相关推荐
- python 服务端主动发数据_python使用socket向客户端发送数据的方法
Python Socket通讯例子详解 创新从模仿开始! python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: ...
- 如何用python批量下载数据_Python批量下载地理空间数据云数据!Python无所不能!...
模拟登录 这里要用到两个包:requests和json.requests使用前得先安装:pip install requests. In [3]: 进群:548377875 即可获取数十套PDF哦! ...
- python程序化 k线指定时间更新_Python获取股票历史、实时数据与更新到数据库
要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...
- python处理行情数据_Python获取股票历史、实时数据与更新到数据库
要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...
- python提取数据库数据_Python如何读取MySQL数据库表数据
本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参考,具体内容如下 环境:Python 3.6 ,Window 64bit 目的:从MySQL数据库读取目标表数据,并处理 ...
- python 大智慧股票行情数据_Python获取股票历史数据和收盘数据的代码实现
各种股票软件,例如通达信.同花顺.大智慧,都可以实时查看股票价格和走势,做一些简单的选股和定量分析,但是如果你想做更复杂的分析,例如回归分析.关联分析等就有点捉襟见肘,所以最好能够获取股票历史及实时数 ...
- python读取json文件制作中国人口地图_Python对JSON文件世界人口数据进行可视化
制作世界人口地图,用json模块来处理,将人口数据进行可视化!!! 下载JSON格式的人口数据,下面附上完整的,在网站中https://datahub.io/下载的数据集的详细过程!!! 1.下载世界 ...
- python覆盖数据库重复数据_Python操作MySQL数据库,插入重复数据
sql = "INSERT INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor. ...
- python socket接收图像 数据_python中socket接受数据的三种方法 | 学步园
原位置:http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859 Description: An issue with socket ...
最新文章
- BIND 子域授权的实现和区域转发实现
- 分享3一个博客HTML5模板
- 谈*静态页*(或网页*静态化*)的时候,请区分一些概念(转)
- sqoop遇到mysql字段为保留字_关于在sqoop 导出数据到mysql数据库的过程对于空字符的处理。...
- hadoop HA 之 QJM
- 【 批量爬取下载geo.datav.aliyun.com下地图的json文 】
- 玩转 SpringBoot 2 快速整合 Servlet
- 自定义地图开发(一)
- python100个内置函数详解_Python 63个内置函数详解
- oracle 10G表空间创建的步骤
- 常用的HTML5和CSS3标签及用法(入门篇)
- 视差滚动效果原理解析和效果实现
- paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
- mysql nlssort_Oracle数据库中文拼音,部首,笔画排序问题,NLS_SORT设置
- Magic Cube
- React hook必须要知道的知识: useEffect的cleanup
- 小白日更第二十九天->DNS域名解析
- php 硬盘序号_怎么查看电脑硬盘序列号
- js msgbox 插件
- php 301目录对应,PHP 301转向实现代码
热门文章
- 2022-2028全球与中国全基因合成市场现状及未来发展趋势
- 爱奇艺数据库选型最佳实干--实操篇
- 关于macOS、iPadOS深色模式无法自动切换的解决方案
- 【NLP】使用 LSTM 和Beam Search进行文本自动完成
- 操作系统-第四章习题
- 阿武老师百搭傲娇句式
- 链表头指针head要设为**head,而不是*head
- Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)
- 本地初次上传代码至gitlab
- 【91xcz】如何屏蔽Windows 7中智能排列的功能