注:此篇文章首次发表于我的一篇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进制数据发送相关推荐

  1. python 服务端主动发数据_python使用socket向客户端发送数据的方法

    Python Socket通讯例子详解 创新从模仿开始! python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: ...

  2. 如何用python批量下载数据_Python批量下载地理空间数据云数据!Python无所不能!...

    模拟登录 这里要用到两个包:requests和json.requests使用前得先安装:pip install requests. In [3]: 进群:548377875 即可获取数十套PDF哦! ...

  3. python程序化 k线指定时间更新_Python获取股票历史、实时数据与更新到数据库

    要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...

  4. python处理行情数据_Python获取股票历史、实时数据与更新到数据库

    要做量化投资,数据是基础,正所谓"巧妇难为无米之炊" 在免费数据方面,各大网站的财经板块其实已提供相应的api,如新浪.雅虎.搜狐...可以通过urlopen相应格式的网址获取数据 ...

  5. python提取数据库数据_Python如何读取MySQL数据库表数据

    本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参考,具体内容如下 环境:Python 3.6 ,Window 64bit 目的:从MySQL数据库读取目标表数据,并处理 ...

  6. python 大智慧股票行情数据_Python获取股票历史数据和收盘数据的代码实现

    各种股票软件,例如通达信.同花顺.大智慧,都可以实时查看股票价格和走势,做一些简单的选股和定量分析,但是如果你想做更复杂的分析,例如回归分析.关联分析等就有点捉襟见肘,所以最好能够获取股票历史及实时数 ...

  7. python读取json文件制作中国人口地图_Python对JSON文件世界人口数据进行可视化

    制作世界人口地图,用json模块来处理,将人口数据进行可视化!!! 下载JSON格式的人口数据,下面附上完整的,在网站中https://datahub.io/下载的数据集的详细过程!!! 1.下载世界 ...

  8. python覆盖数据库重复数据_Python操作MySQL数据库,插入重复数据

    sql = "INSERT INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor. ...

  9. python socket接收图像 数据_python中socket接受数据的三种方法 | 学步园

    原位置:http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859 Description: An issue with socket ...

最新文章

  1. BIND 子域授权的实现和区域转发实现
  2. 分享3一个博客HTML5模板
  3. 谈*静态页*(或网页*静态化*)的时候,请区分一些概念(转)
  4. sqoop遇到mysql字段为保留字_关于在sqoop 导出数据到mysql数据库的过程对于空字符的处理。...
  5. hadoop HA 之 QJM
  6. 【 批量爬取下载geo.datav.aliyun.com下地图的json文 】
  7. 玩转 SpringBoot 2 快速整合 Servlet
  8. 自定义地图开发(一)
  9. python100个内置函数详解_Python 63个内置函数详解
  10. oracle 10G表空间创建的步骤
  11. 常用的HTML5和CSS3标签及用法(入门篇)
  12. 视差滚动效果原理解析和效果实现
  13. paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
  14. mysql nlssort_Oracle数据库中文拼音,部首,笔画排序问题,NLS_SORT设置
  15. Magic Cube
  16. React hook必须要知道的知识: useEffect的cleanup
  17. 小白日更第二十九天->DNS域名解析
  18. php 硬盘序号_怎么查看电脑硬盘序列号
  19. js msgbox 插件
  20. php 301目录对应,PHP 301转向实现代码

热门文章

  1. 2022-2028全球与中国全基因合成市场现状及未来发展趋势
  2. 爱奇艺数据库选型最佳实干--实操篇
  3. 关于macOS、iPadOS深色模式无法自动切换的解决方案
  4. 【NLP】使用 LSTM 和Beam Search进行文本自动完成
  5. 操作系统-第四章习题
  6. 阿武老师百搭傲娇句式
  7. 链表头指针head要设为**head,而不是*head
  8. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)
  9. 本地初次上传代码至gitlab
  10. 【91xcz】如何屏蔽Windows 7中智能排列的功能