python处理二进制数据
来源:互联网 发布:淘宝死号怎样恢复 编辑:程序博客网 时间:2024/06/10 17:39
问题
在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),在交测之前,自己用python写个接受数据的server,解析下拼成的数据格式是否正确。用python写比C语言简单很多。
PS:实际上我是不会python的,工作中是C/C++开发,使用python纯属是为了偷懒^_^
举个具体的例子:通信双方约定的数据格式为
数据格式为二进制的,python需要用到struct模块处理二进制数据。struct模块中最重要的三个函数pack(), unpack(), calcsize()。因为struct相当于C语言中的结构体,unpack()返回的是一个元组。struct支持的格式如下表
注1)q和Q只有在机器支持64位时有意义;
注2)每个格式前可以有一个数字,表示个数;
注3)s格式表示一定长度的字符串,4s表示长度为4的字符串,p表示的是pascal字符串;
注4)P用来转换一个指针,其长度和机器字长有关;
默认情况下struct根据本地机器字节顺序转换,也可以用格式中的第一个字符来改变对齐方式。定义如下:
注:无论数据包是python程序struct.pack()得到的,或者是C,C++,Java程序拼成的,只需保证client端和server端字节顺序保持一致即可。
以文章开头的例子来说明pack()和unpack()函数:
注:测试环境中中文为utf-8编码(python的编码折腾了半天,也没太懂,这里不是重点)
1)pack(format, v1, v2, ...)按照指定的格式(format),把数据封装成字符串,例如
>>s=struct.pack("2i13si6s2i", 33, 13, "www.baidu.com", 6, "冬季", 0, 0)
2)unpack(format, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple,例如
>>us=struct.unpack("2i13si6s2i", s)
输出结果:
>>print us
(33, 13, 'www.baidu.com', 6, '\xe5\x86\xac\xe5\xad\xa3', 0, 0)
注: 中文部分是二进制,从元组中取出来再打印
>> print us[4]
冬季
注:对python下的中文编码感兴趣的同学可以研究下python环境编码(再次说明我真的不会python! >_<)
举个简单的例子:
#!/usr/bin/pythonimport socketimport structimport osimport timeif __name__ == "__main__": server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("127.0.0.1", 51001)) #本机端口号51001 server.listen(1) while (1): conn,client = server.accept() conn.settimeout(5000) #设置超时时间 msg = conn.recv(4) #total data length if len(msg) <= 0: #接收空数据包 continue data = struct.unpack("i", msg) print "Recv Total length:%d"%(data[0]) process_len = 0 msg = conn.recv(data[0]) for i in range(0,4): #循环四次,分别取 url title content author para = msg[process_len:(process_len + 4)] if len(para) < 4: #如果某一字段为空,不处理 continue data = struct.unpack("i", para) str_len = data[0] print "%d"%(str_len) para = msg[(process_len + 4):(process_len + 4 + str_len)] if len(para) < str_len: #如果实际收到的字符串长度小于数据头给的长度,不处理 continue data = struct.unpack("%ds"%(str_len), para) print "%s"%(data[0]) process_len = process_len + 4 + str_len conn.close()
部分输出结果:
Recv Total length:355
117
http://mamashuozhelideidamasaike.com/nikanbudaoleba.html(补齐117位)
27
【段子】老板讲笑话
186
老板今天在办公室给大家讲了一个笑话,所有人都笑得人仰马翻,只有小李没笑。我笑着问他怎么不笑,小李冷冷答道:“我已经辞职了!”
9
春秋天
参考资料:http://blog.163.com/tieying5566@126/blog/static/6421517120117342958949/
- python处理二进制数据
- python处理二进制数据
- python处理二进制数据
- python处理二进制数据
- python处理二进制数据
- 【转】python中用struct模块处理二进制数据
- python中用struct模块处理二进制数据(转)
- python中用struct模块处理二进制数据(转)
- python读写二进制数据的处理方理
- 利用Python对二进制数据进行按位处理
- Python处理二进制结构化数据时的技术细节
- Python使用struct处理二进制 解析二进制数据 解析socket数据
- Python使用struct处理二进制 解析二进制数据 解析socket数据
- python处理二进制
- python二进制处理详述
- python二进制处理详述
- python二进制处理详述
- 处理二进制数据
- 大牛们的讨论,非常棒,推荐推荐--微信支付能颠覆支付宝吗?传统企业如何互联网化?
- acad中无法调试对话框后面的断点代码的解决方案
- matlab仿真正态分布曲线
- 灵魂最美的音乐是善良
- xtrabackup备份与恢复数据库
- python处理二进制数据
- C++标准库 list使用方法
- jquery学习笔记 之二 事件与效果
- SQL之常用时间函数练习
- Log4J通用配置|注意问题 笔记
- web前端-获取用户的来源是否为新浪微博
- 电脑显示Android手机屏幕——Android Screen Monitor
- PHP协程实现多任务合作
- SCC Tarjan算法