Python模組–struct 資料格式轉換

來源:互聯網
上載者:User

Python是
一門非常簡潔的語言,對於資料類型的表示,不像其他語言預定義了許多類型(如:在C#中,光整型就定義了8種),它只定義了六種基本類型:字串,整數,
浮點數,元組,列表,字典。通過這六種資料類型,我們可以完成大部分工作。但當Python需要通過網路與其他的平台進行互動的時候,必須考慮到將這些數
據類型與其他平台或語言之間的類型進行互相轉換問題。打個比方:C++寫的用戶端發送一個int型(4位元組)變數的資料到
Python寫的伺服器,Python接收到表示這個整數的4個位元組資料,怎麼解析成Python認識的整數呢?
Python的標準模組struct就用來解決這個問題。

  struct模組的內容不多,也不是太難,下面對其中最常用的方法進行介紹:

 struct.pack

  struct.pack用於將Python的值根據格式符,轉換為字串(因為Python中沒有位元組(Byte)類型,可以把這裡的字串理
解為位元組流,或位元組數組)。其函數原型為:struct.pack(fmt, v1, v2, ...),參數fmt是格式字串,關于格式字串的相關資訊在下面有所介紹。v1,
v2, ...表示要轉換的python值。下面的例子將兩個整數轉換為字串(位元組流):

 

 
  1. import
     struct  
  2.   
  3. a = 20
      
  4. b = 400
      
  5.   
  6. str = struct.pack("ii"
    , a, b)  
    #轉換後的str雖然是字串類型,但相當於其他語言中的位元組流(位元組數組),可以在網路上傳輸
      
  7. print
     
    'length:'
    , len(str)  
  8. print
     str  
  9. print
     repr(str)  
  10.   
  11. #---- result
      
  12. #length: 8
      
  13. #    ----這裡是亂碼
      
  14.  
  1. #'/x14/x00/x00/x00/x90/x01/x00/x00'
      

import struct<br />a = 20<br />b = 400<br />str = struct.pack("ii", a, b)<br />#轉換後的str雖然是字串類型,但相當於其他語言中的位元組流(位元組數組),可以在網路上傳輸<br />print 'length:', len(str)<br />print str<br />print repr(str)<br />#---- result<br />#length: 8<br /># ----這裡是亂碼<br />#'/x14/x00/x00/x00/x90/x01/x00/x00'

 

格式符"i"表示轉換為int,'ii'表示有兩個int變數。進行轉換後的結果長度為8個位元組(int類型佔用4個位元組,兩個int為8個字
節),可以看到輸出的結果是亂碼,因為結果是位元據,所以顯示為亂碼。可以使用python的內建函數repr來擷取可識別的字串,其中十六進位的
0x00000014, 0x00001009分別表示20和400。

struct.unpack

  struct.unpack做的工作剛好與
struct.pack相反,用於將位元組流轉換成python資料類型。它的函數原型為:struct.unpack(fmt,
string),該函數返回一個元組
。 下面是一個簡單的例子:



 
  1. str = struct.pack(
    "ii"

    20

    400
    )  
  2. a1, a2 = struct.unpack("ii"
    , str)  
  3. print
     
    'a1:'
    , a1  
  4. print
     
    'a2:'
    , a2  
  5.   
  6. #---- result:
      
  7. #a1: 20
      
  8. #a2: 400
      

str = struct.pack("ii", 20, 400)<br />a1, a2 = struct.unpack("ii", str)<br />print 'a1:', a1<br />print 'a2:', a2<br />#---- result:<br />#a1: 20<br />#a2: 400<br />

 

struct.calcsize

  struct.calcsize用於計算格式字串所對應的結果的長度,如:struct.calcsize('ii'),返回8。因為
兩個int類型所佔用的長度是8個位元組。

struct.pack_into, struct.unpack_from

   這兩個函數在Python手冊中有所介紹,但沒有給出如何使用的例子。其實
它們在實際應用中用的並不多。Google了很久,才找到一個例子,貼出來共用一下:

 

 
  1. import
     struct  

  2. from
     ctypes 
    import
     create_string_buffer  

  3.   
  4. buf = create_string_buffer(12
    )  

  5. print
     repr(buf.raw)  

  6.   
  7. struct.pack_into("iii"
    , buf, 
    0

    1

    2
    , -
    1
    )  

  8. print
     repr(buf.raw)  

  9.   
  10. print
     struct.unpack_from(
    'iii'
    , buf, 
    0
    )  

  11.   
  12. #---- result
      

  13. #'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'
      

  14. #'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'
      

  15.  

  1. #(1, 2, -1)
      


import struct<br />from ctypes import create_string_buffer<br />buf = create_string_buffer(12)<br />print repr(buf.raw)<br />struct.pack_into("iii", buf, 0, 1, 2, -1)<br />print repr(buf.raw)<br />print struct.unpack_from('iii', buf, 0)<br />#---- result<br />#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'<br />#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'<br />#(1, 2, -1)

 

關于格式字串

  在Python手冊中,給出了C語言中常用類型與Python類型對應的格式
符:

 

格式符 C語言類型 Python類型
x


pad byte no value  
c


char


string of length 1  
b


signed
char


integer  
B


unsigned
char


integer  
?


_Bool


bool  
h


short


integer  
H


unsigned
short


integer  
i


int


integer  
I


unsigned
int


integer or long  
l


long


integer  
L


unsigned
long


long  
q


long
long


long  
Q


unsigned
long
long


long  
f


float


float  
d


double


float  
s


char[]


string  
p


char[]


string  
P


void
*


long

具體內容請參考Python手冊 struct 模組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.