python处理二进制数据

原创 2013年12月05日 16:41:26

问题

       在工作中经常会用到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/python
import socket
import struct
import os
import time

if __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中使用struct模块打包二进制数据

运行环境:python3.4.3demo.py:f=open('s_data.bin','wb') import struct s=b'Allen' data=struct.pack('>i5si',...
  • u014291497
  • u014291497
  • 2016年04月05日 15:14
  • 1492

利用Python对二进制数据进行按位处理

最近在用Python做数据包解析,遇到一些要按位处理二进制数据的问题。折腾了一个早上,大概有一点思路,记下来备忘吧。 我要解决的问题是判断一个字节的某几位是否为特定的值,比如判断一个字节的前四位是不是...
  • u012322724
  • u012322724
  • 2015年02月05日 12:06
  • 2760

Python中二进制数据处理模块struct使用

Python中没有二进制类型,但是可以使用string字符串类型来存储二进制数据,然后使用struct模块来对二进制数据进行处理。下面将详细描述如何使用struct模块来处理二进制数据。 使用str...
  • fan_hai_ping
  • fan_hai_ping
  • 2012年12月24日 12:23
  • 8656

python处理二进制数据

有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用struct来处理c语言中的结构体. struct模块中...
  • summerhust
  • summerhust
  • 2011年09月01日 14:01
  • 5514

python读写二进制数据的处理方理

#!/usr/env/env python #-*- coding: cp936 -*- ''' add Head Infomation for pcm file ''' import sys imp...
  • bob_hu924
  • bob_hu924
  • 2011年12月19日 17:13
  • 2302

Python处理二进制结构化数据时的技术细节

处理二进制文件或者从网络接收字节流时,字节流中的结构化数据可能存在二进制有符号数。虽然开发者根据字节流协议可以先验的知道有符号数的字节序、字长、符号位等信息,但在使用Python进行类型转换时缺少将这...
  • ir0nf1st
  • ir0nf1st
  • 2017年04月07日 17:55
  • 793

python处理二进制数据

有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体.   struct模...
  • richard_he2011
  • richard_he2011
  • 2014年10月06日 14:30
  • 346

python中用struct模块处理二进制数据(转)

http://blog.163.com/tieying5566@126/blog/static/6421517120117342958949/ 有的时候需要用python处理二进制数据,...
  • ZhengKarl
  • ZhengKarl
  • 2011年10月18日 20:19
  • 5626

python处理二进制数据

python处理二进制数据 分类: Python 2011-09-01 14:01 567人阅读 评论(0) 收藏 举报   有的时候需要用python处理二进...
  • lionzl
  • lionzl
  • 2013年02月19日 02:03
  • 743

Python二进制处理 --实现SHA-1算法

  • 2011年12月13日 19:43
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python处理二进制数据
举报原因:
原因补充:

(最多只允许输入30个字)