python
中的struct主要是用來(lái)處理C結(jié)構(gòu)數(shù)據(jù)的,,讀入時(shí)先轉(zhuǎn)換為Python的
字符串
類型,然后再轉(zhuǎn)換為Python的結(jié)構(gòu)化類型,,比如元組(tuple)啥的~,。一般輸入的渠道來(lái)源于文件或者網(wǎng)絡(luò)的二進(jìn)制流。
1.struct.pack()和struct.unpack() 在轉(zhuǎn)化過(guò)程中,,主要用到了一個(gè)格式化字符串(format strings),,用來(lái)規(guī)定轉(zhuǎn)化的方法和格式。 下面來(lái)談?wù)勚饕姆椒ǎ?/p> 1.1 struct.pack(fmt,v1,v2,.....) 將v1,v2等參數(shù)的值進(jìn)行一層包裝,,包裝的方法由fmt指定,。被包裝的參數(shù)必須嚴(yán)格符合fmt。最后返回一個(gè)包裝后的字符串,。 1.2 struct.unpack(fmt,string) 顧名思義,,解包。比如pack打包,,然后就可以用unpack解包了,。返回一個(gè)由解包數(shù)據(jù)(string)得到的一個(gè)元組(tuple), 即使僅有一個(gè)數(shù)據(jù)也會(huì)被解包成元組,。其中l(wèi)en(string) 必須等于 calcsize(fmt),這里面涉及到了一個(gè)calcsize函數(shù),。struct.calcsize(fmt):這個(gè)就是用來(lái)計(jì)算fmt格式所描述的結(jié)構(gòu)的大小,。 格式字符串(format string)由一個(gè)或多個(gè)格式字符(format characters)組成,對(duì)于這些格式字符的描述參照Python manual如下: 2.代碼示例
首先將參數(shù)1,2,3打包,,打包前1,2,3明顯屬于python數(shù)據(jù)類型中的integer,pack后就變成了C結(jié)構(gòu)的二進(jìn)制串,,轉(zhuǎn)成 python的string類型來(lái)顯示就是 '\x01\x00\x00\x00\x02\x00\x03'。由于本機(jī)是小端('little- endian',關(guān)于大端和小端的區(qū)別請(qǐng)參照這里, 故而高位放在低地址段,。i 代表C struct中的int類型,,故而本機(jī)占4位,1則表示為01000000;h 代表C struct中的short類型,,占2位,,故表示為0200;同理b 代表C struct中的signed char類型,占1位,,故而表示為03,。 其他結(jié)構(gòu)的轉(zhuǎn)換也類似,有些特別的可以參考官方文檔的Manual,。 在Format string 的首位,,有一個(gè)可選字符來(lái)決定大端和小端,列表如下: 如果沒(méi)有附加,,默認(rèn)為@,,即使用本機(jī)的字符順序(大端or小端),對(duì)于C結(jié)構(gòu)的大小和內(nèi)存中的對(duì)齊方式也是與本機(jī)相一致的(native),,比如有的機(jī)器integer為2位而有的機(jī)器則為四位;有的機(jī)器內(nèi)存對(duì)其位四位對(duì)齊,,有的則是n位對(duì)齊(n未知,我也不知道多少),。 還有一個(gè)標(biāo)準(zhǔn)的選項(xiàng),,被描述為:如果使用標(biāo)準(zhǔn)的,則任何類型都無(wú)內(nèi)存對(duì)齊,。 比如剛才的小程序的后半部分,,使用的format string中首位為!,,即為大端模式標(biāo)準(zhǔn)對(duì)齊方式,,故而輸出的為'\x00\x00\x00\x01\x00\x02\x03',其中高位自己就被放在內(nèi)存的高地址位了,。 以上就是Python中struct.pack()和struct.unpack()用法詳細(xì)說(shuō)明的詳細(xì)內(nèi)容,,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章! |
|