日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python struct pack解析_python struct pack

發(fā)布時間:2025/4/5 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python struct pack解析_python struct pack 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這個struct主要是用來處理C結(jié)構(gòu)數(shù)據(jù)的,讀入時先轉(zhuǎn)換為Python的字符串類型,然后再轉(zhuǎn)換為Python的結(jié)構(gòu)化類型,比如元組(tuple)啥的~

一般輸入的渠道來源于文件或者網(wǎng)絡(luò)的二進(jìn)制流。

在轉(zhuǎn)化過程中,主要用到了一個格式化字符串(format strings),用來規(guī)定轉(zhuǎn)化的方法和格式。

下面來談?wù)勚饕姆椒?#xff1a;

struct.pack(fmt,v1,v2,.....)

將v1,v2等參數(shù)的值進(jìn)行一層包裝,包裝的方法由fmt指定。被包裝的參數(shù)必須嚴(yán)格符合fmt。最后返回一個包裝后的字符串。

struct.unpack(fmt,string)

顧 名思義,解包。比如pack打包,然后就可以用unpack解包了。返回一個由解包數(shù)據(jù)(string)得到的一個元組(tuple), 即使僅有一個數(shù)據(jù)也會被解包成元組。其中l(wèi)en(string) 必須等于 calcsize(fmt),這里面涉及到了一個calcsize函數(shù),再后面談到。

struct.calcsize(fmt)

這個就是用來計算fmt格式所描述的結(jié)構(gòu)的大小。

格式字符串(format string)由一個或多個格式字符(format characters)組成,對于這些格式字符的描述參照Python manual如下Formatc TypePythonNotexpad byteno value

ccharstring of length 1

bsignedcharinteger

Bunsignedcharinteger

?_Boolbool(1)

hshortinteger

Hunsignedshortinteger

iintinteger

Iunsignedintinteger or long

llonginteger

Lunsignedlonglong

qlonglonglong(2)

Qunsignedlonglonglong(2)

ffloatfloat

ddoublefloat

schar[]string

pchar[]string

Pvoid*long

說到這里,大家可能都有點(diǎn)迷糊了,那就看一段小代碼

importstruct#native byteorderbuffer=struct.pack("ihb",1,2,3)printrepr(buffer)printstruct.unpack("ihb", buffer)#data from a sequence, network byteorderdata=[1,2,3]

buffer=struct.pack("!ihb",*data)printrepr(buffer)printstruct.unpack("!ihb", buffer)

Output:

'\x01\x00\x00\x00\x02\x00\x03'

(1, 2, 3)

'\x00\x00\x00\x01\x00\x02\x03'

(1, 2, 3)

首 先將參數(shù)1,2,3打包,打包前1,2,3明顯屬于python數(shù)據(jù)類型中的integer,pack后就變成了C結(jié)構(gòu)的二進(jìn)制串,轉(zhuǎn)成 python的string類型來顯示就是  '\x01\x00\x00\x00\x02\x00\x03'。由于本機(jī)是小端('little- endian',關(guān)于大端和小端的區(qū)別請參照這里, 故而高位放在低地址段。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 的首位,有一個可選字符來決定大端和小端,列表如下:@nativenative

=nativestandard

>big-endianstandard

!network (= big-endian)standard

如果沒有附加,默認(rèn)為@,即使用本機(jī)的字符順序(大端or小端),對于C結(jié)構(gòu)的大小和內(nèi)存中的對齊方式也是與本機(jī)相一致的(native),比如有的機(jī)器integer為2位而有的機(jī)器則為四位;有的機(jī)器內(nèi)存對其位四位對齊,有的則是n位對齊(n未知,我也不知道多少)。

還有一個標(biāo)準(zhǔn)的選項,被描述為:如果使用標(biāo)準(zhǔn)的,則任何類型都無內(nèi)存對齊。

比如剛才的小程序的后半部分,使用的format string中首位為!,即為大端模式標(biāo)準(zhǔn)對齊方式,故而輸出的為'\x00\x00\x00\x01\x00\x02\x03',其中高位自己就被放在內(nèi)存的高地址位了。

關(guān)于struct模塊的講解就到這里。本文只做引子,詳細(xì)內(nèi)容可以參見手冊。由于水平有限,謬誤之處還請指出。

總結(jié)

以上是生活随笔為你收集整理的python struct pack解析_python struct pack的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。