国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

在Python的struct模塊中進行數據格式轉換的方法

2020-02-23 01:37:20
字體:
來源:轉載
供稿:網友

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值。下面的例子將兩個整數轉換為字符串(字節流):
 

import struct a = 20b = 400 str = struct.pack("ii", a, b) #轉換后的str雖然是字符串類型,但相當于其他語言中的字節流(字節數組),可以在網絡上傳輸print 'length:', len(str)print strprint repr(str) #---- result#length: 8#  ----這里是亂碼#'/x14/x00/x00/x00/x90/x01/x00/x00'

格式符”i”表示轉換為int,'ii'表示有兩個int變量。進行轉換后的結果長度為8個字節(int類型占用4個字節,兩個int為8個字節),可以看到輸出的結果是亂碼,因為結果是二進制數據,所以顯示為亂碼。可以使用python的內置函數repr來獲取可識別的字符串,其中十六進制的0×00000014, 0×00001009分別表示20和400。
struct.unpack

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

str = struct.pack("ii", 20, 400)a1, a2 = struct.unpack("ii", str)print 'a1:', a1print 'a2:', a2 #---- result:#a1: 20#a2: 400struct.calcsize

struct.calcsize用于計算格式字符串所對應的結果的長度,如:struct.calcsize(‘ii'),返回8。因為兩個int類型所占用的長度是8個字節。
struct.pack_into, struct.unpack_from

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

import structfrom ctypes import create_string_buffer buf = create_string_buffer(12)print repr(buf.raw) struct.pack_into("iii", buf, 0, 1, 2, -1)print repr(buf.raw) print struct.unpack_from('iii', buf, 0) #---- result#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'#(1, 2, -1)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 咸阳市| 松溪县| 荔浦县| 镶黄旗| 广饶县| 中阳县| 太原市| 宣威市| 林芝县| 疏勒县| 乌鲁木齐县| 宁都县| 茌平县| 监利县| 临西县| 溧阳市| 白朗县| 汶上县| 桂阳县| 额敏县| 寻乌县| 辉县市| 刚察县| 清水河县| 策勒县| 宜章县| 枝江市| 鲁山县| 南靖县| 沙洋县| 卓资县| 察雅县| 乐山市| 敦化市| 杭锦后旗| 中方县| 团风县| 丹江口市| 九寨沟县| 保靖县| 嫩江县|