Python內(nèi)建模塊struct實(shí)例詳解
本文研究的主要是Python內(nèi)建模塊struct的相關(guān)內(nèi)容,具體如下。
Python中變量的類型只有列表、元祖、字典、集合等高級抽象類型,并沒有像c中定義了位、字節(jié)、整型等底層初級類型。因?yàn)镻ython本來就是高級解釋性語言,運(yùn)行的時候都是經(jīng)過翻譯后再在底層運(yùn)行。如何打通Python和其他語言之間的類型定義障礙,Python的內(nèi)建模塊struct完全解決了所有問題。
知識介紹:
在struct模塊中最最常用的三個:
(1)struct.pack:用于將Python的值根據(jù)格式符,轉(zhuǎn)換為字符串(因?yàn)镻ython中沒有字節(jié)(Byte)類型,可以把這里的字符串理解為字節(jié)流,或字節(jié)數(shù)組)。
(2)struct.unpack: 剛好與struct.pack相反,用于將字節(jié)流轉(zhuǎn)換成python數(shù)據(jù)類型,該函數(shù)返回一個元組。
(3)struct.calcsize: 計(jì)算格式字符串所對應(yīng)的結(jié)果的長度。
轉(zhuǎn)換過程中遇到的格式操作:
格式符 | 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 |
實(shí)例詳解:
#!/usr/bin/python # -*- coding:utf-8 -*- '''測試struct模塊''' from struct import * import array def fun_calcsize(): print 'ci:',calcsize('ci')#計(jì)算格式占內(nèi)存大小 print '@ci:',calcsize('@ci') print '=ci:',calcsize('=ci') print '>ci:',calcsize('>ci') print '<ci:',calcsize('<ci') print 'ic:',calcsize('ic')#計(jì)算格式占內(nèi)存大小 print '@ic:',calcsize('@ic') print '=ic:',calcsize('=ic') print '>ic:',calcsize('>ic') print '<ic:',calcsize('<ic') def fun_pack(Format,msg = [0x11223344,0x55667788]): result = pack(Format,*msg) print 'pack'.ljust(10),str(type(result)).ljust(20), for i in result: print hex(ord(i)), # ord把ASCII碼表中的字符轉(zhuǎn)換成對應(yīng)的整形,hex將數(shù)值轉(zhuǎn)化為十六進(jìn)制 print result = unpack(Format,result) print 'unpack'.ljust(10),str(type(result)).ljust(20), for i in result: print hex(i), print def fun_pack_into(Format,msg = [0x11223344,0x55667788]): r = array.array('c',' '*8)#大小為8的可變緩沖區(qū),writable buffer result = pack_into(Format,r,0,*msg) print 'pack_into'.ljust(10),str(type(result)).ljust(20), for i in r.tostring(): print hex(ord(i)), print result = unpack_from(Format,r,0) print 'pack_from'.ljust(10),str(type(result)).ljust(20), for i in result: print hex(i), print def IsBig_Endian(): '''判斷本機(jī)為大/小端''' a = 0x12345678 result = pack('i',a)#此時result就是一個string字符串,字符串按字節(jié)同a的二進(jìn)制存儲內(nèi)容相同。 if hex(ord(result[0])) == '0x78': print '本機(jī)為小端' else: print '本機(jī)為大端' def test(): a = '1234' for i in a: print '字符%s的二進(jìn)制:'%i,hex(ord(i))#字符對應(yīng)ascii碼表中對應(yīng)整數(shù)的十六進(jìn)制 ''' 不用unpack()返回的數(shù)據(jù)也是可以使用pack()函數(shù)的,只要解包的字符串符合解包格式即可, pack()會按照解包格式將字符串在內(nèi)存中的二進(jìn)制重新解釋(說的感覺不太好...,見下例) ''' print '大端:',hex(unpack('>i',a)[0])#因?yàn)閜ack返回的是元組,即使只有一個元素也是元組的形式 print '小端:',hex(unpack('<i',a)[0]) if __name__ == "__main__": print '判斷本機(jī)是否為大小端?', IsBig_Endian() fun_calcsize() print '大端:' Format = ">ii" fun_pack(Format) fun_pack_into(Format) print '小端:' Format = "<ii" fun_pack(Format) fun_pack_into(Format) print 'test' test() ''' result: 判斷本機(jī)是否為大小端? 本機(jī)為小端 ci: 8 @ci: 8 =ci: 5 >ci: 5 <ci: 5 ic: 5 @ic: 5 =ic: 5 >ic: 5 <ic: 5 大端: pack <type 'str'> 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 unpack <type 'tuple'> 0x11223344 0x55667788 pack_into <type 'NoneType'> 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 pack_from <type 'tuple'> 0x11223344 0x55667788 小端: pack <type 'str'> 0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55 unpack <type 'tuple'> 0x11223344 0x55667788 pack_into <type 'NoneType'> 0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55 pack_from <type 'tuple'> 0x11223344 0x55667788 test 字符1的二進(jìn)制: 0x31 字符2的二進(jìn)制: 0x32 字符3的二進(jìn)制: 0x33 字符4的二進(jìn)制: 0x34 大端:0x31323334 小端:0x34333231 '''
本實(shí)例所用Python軟件環(huán)境:win10+anaconda3+pycharm,Python版本:3.6
總結(jié)
以上就是本文關(guān)于Python內(nèi)建模塊struct實(shí)例詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
淺談pycharm導(dǎo)入pandas包遇到的問題及解決
這篇文章主要介紹了淺談pycharm導(dǎo)入pandas包遇到的問題及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06詳解如何在cmd命令窗口中搭建簡單的python開發(fā)環(huán)境
這篇文章主要介紹了詳解如何在cmd命令窗口中搭建簡單的python開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08如何使用 Python 讀取文件和照片的創(chuàng)建日期
這篇文章主要介紹了如何使用 Python 讀取文件和照片的創(chuàng)建日期,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Anconda環(huán)境下Vscode安裝Python的方法詳解
anaconda指的是一個開源的Python發(fā)行版本,其包含了conda、Python等180多個科學(xué)包及其依賴項(xiàng)。這篇文章主要介紹了Anconda環(huán)境下Vscode安裝Python的方法,需要的朋友可以參考下2020-03-03python matplotlib模塊基本圖形繪制方法小結(jié)【直線,曲線,直方圖,餅圖等】
這篇文章主要介紹了python matplotlib模塊基本圖形繪制方法,結(jié)合實(shí)例形式總結(jié)分析了Python使用matplotlib模塊繪制直線,曲線,直方圖,餅圖等圖形的相關(guān)操作技巧,需要的朋友可以參考下2020-04-04python3實(shí)現(xiàn)語音轉(zhuǎn)文字(語音識別)和文字轉(zhuǎn)語音(語音合成)
這篇文章主要介紹了python3實(shí)現(xiàn)語音轉(zhuǎn)文字(語音識別)和文字轉(zhuǎn)語音(語音合成),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10