python中沒有二進位制型別,但是可以使用string字串型別來儲存二進位制資料,然後使用struct模組來對二進位制資料進行處理。下面將詳細描述如何使用struct模組來處理二進位制資料。
使用struct.pack把乙個整數值打包成字串,開啟python命令列,輸入:
>>>import struct
>>> a =0x01020304
>>> str= struct.pack("i", a)
>>>repr(str)
"'\\x04\\x03\\x02\\x01'"
此時,str為乙個字串,字串中的內容與整數a的二進位制儲存的內容相同。
使用struct.unpack把字串解包成整數型別,如下:
>>> b =struct.unpack("i", str)
>>> b
(16909060,)
在解包之後,返回乙個元組型別(tuple)的資料。
如果多個資料進行打包,可以在格式中指定打包的資料型別,然後資料通過引數傳入:
>>> a ="hello"
>>> b ="world!"
>>> c =2
>>> d =45.123
>>> str= struct.pack("5s6sif", a, b, c, d)
等價於: struct.pack_into(「5s6sif」,str, 0, a, b, c, d)
>>> str
'helloworld!\x00\x02\x00\x00\x00\xf4}4b'
解包多個資料可以這樣做:
>>>parts = struct.unpack("5s6sif", str)
等價於: struct.unpack_from(「5s6sif」, str, 0)
>>>parts
('hello','world!', 2, 45.12300109863281)
從上可以看到浮點值在解包後與原來值不一樣,這是因為浮點數的精度問題導致的。
struct模組中二進位制格式化表示
格式c型別
python型別
位元組數x
填充位元組無值c
char
長度為1的字串
bsigned char整型b
unsigned char
整型_bool
bool
hshort整型h
unsigned short整型i
int整型
iunsigned int整型l
long整型l
unsigned long整型q
long long 整型q
unsigned long long 整型f
float
浮點數d
double
浮點數s
char
字串p
char
字串p
void *
long
最後乙個可以用來表示指標型別,佔4個位元組(32位),8個位元組(64位)。
為了在與不同硬體結構之間交換資料,需要考慮位元組序,如下:
字元位元組序
大小和對齊
本機位元組序
本機,本機4位元組對齊
本機位元組序
標準,按原位元組數對齊
小尾位元組序
標準,按原位元組數對齊
大尾位元組序
標準,按原位元組對齊
網路位元組序(大尾)
標準,按原位元組對齊
注:預設的情況下,使用本機位元組序(同@),可以通過上面的字元修改位元組序。
計算格式字串的大小函式:struct.calcsize(fmt)
>>>struct.calcsize("ihi") 預設為4位元組對齊時,長度為12
>>>struct.calcsize("iih") 當h在最後的時(此時不4位元組對齊),長度為10
10
>>>struct.calcsize("@ihi")
>>>struct.calcsize("=ihi")
>>>struct.calcsize(">ihi")
>>>struct.calcsize(">>>struct.calcsize("!ihi")
注:二進位制檔案開啟/讀取的時候需要使用「rb」/「wb」模式以二進位制方式開啟/讀取檔案。
注:關於le(little-endian)和be(big-endian)區別:
le—最符合人的思維的位元組序,位址低位儲存值的低位,位址高位儲存值的高位。
be—最直觀的位元組序,位址低位儲存值的高位,位址高位儲存值的低位。
例如:雙字0x01020304在記憶體中儲存方式,le=0403 02 01,be=01 02 03 04。
4 二進位制資料處理庫
二進位制處理庫主要是針對二進位制資料的操作和使用,也有介紹一些特定的操作,比如像檔案格式和網路協議。在前面也介紹了文字處理庫,其實有一部分功能也是能處理二進位制資料的,比如正規表示式re,或者是difflib比較庫對資料進行處理。此外,在python內部也提供了bytes bytearray mem...
python處理二進位制資料
處理二進位制資料離不開python的struct模組,struct理解上你可以把它理解為c語言的結構體,使用該模組的pack和unpack方法,可以很容易的把二進位制資料轉換為常用的型別資料,如整型 字元型等 結構體如下 struct header 將二進位制資料流解析為常用的資料型別,例如 pyt...
python中二進位制 Python中的二進位制樹
這是我在 python中實現二叉樹實現的 片段.這在執行preorder函式時起作用.class node def init self,data self.left none self.right none self.data data class binarytree node def init ...