python socket 二進位

來源:互聯網
上載者:User

標籤:

問題

       在工作中經常會用到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()

 

python socket 二進位

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.