python中變數的型別只有列表、元祖、字典、集合等高階抽象型別,並沒有像c中定義了位、位元組、整型等底層初級型別。因為python本來就是高階解釋性語言,執行的時候都是經過翻譯後再在底層執行。如何打通python和其他語言之間的型別定義障礙,python的內建模組struct完全解決了所有問題。
在struct模組中最最常用的三個:
(1)struct.pack:用於將python的值根據格式符,轉換為字串(因為python中沒有位元組(byte)型別,可以把這裡的字串理解為位元組流,或位元組陣列)。
(2)struct.unpack: 剛好與struct.pack相反,用於將位元組流轉換成python資料型別,該函式返回乙個元組。
(3)struct.calcsize: 計算格式字串所對應的結果的長度。
轉換過程中遇到的格式操作:
格式符c語言型別
python型別
xpad byte
no value
cchar
string of length 1
bsigned char
integer
bunsigned char
integer
?_bool
bool
hshort
integer
hunsigned short
integer
iint
integer
iunsigned int
integer or long
llong
integer
lunsigned long
long
qlong long
long
qunsigned long long
long
ffloat
float
ddouble
float
schar
string
pchar
string
pvoid *
long
#!/usr/bin/python
# -*- coding:utf-8 -*-
'''測試struct模組'''
from struct import *
import array
deffun_calcsize
():print
'ci:',calcsize('ci')#計算格式佔記憶體大小
print
'@ci:',calcsize('@ci')
print
'=ci:',calcsize('=ci')
print
'>ci:',calcsize('>ci')
print
',calcsize(')
print
'ic:',calcsize('ic')#計算格式佔記憶體大小
print
'@ic:',calcsize('@ic')
print
'=ic:',calcsize('=ic')
print
'>ic:',calcsize('>ic')
print
',calcsize(')
deffun_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碼表中的字元轉換成對應的整形,hex將數值轉化為十六進製制
print
result = unpack(format,result)
print
'unpack'.ljust(10),str(type(result)).ljust(20),
for i in result:
print hex(i),
print
deffun_pack_into
(format,msg = [0x11223344,0x55667788]):
r = array.array('c',' '*8)#大小為8的可變緩衝區,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
defisbig_endian
():'''判斷本機為大/小端'''
a = 0x12345678
result = pack('i',a)#此時result就是乙個string字串,字串按位元組同a的二進位制儲存內容相同。
if hex(ord(result[0])) == '0x78':
print
'本機為小端'
else:
print
'本機為大端'
deftest
(): a = '1234'
for i in a:
print
'字元%s的二進位制:'%i,hex(ord(i))#字元對應ascii碼表中對應整數的十六進製制
''' 不用unpack()返回的資料也是可以使用pack()函式的,只要解包的字串符合解包格式即可,
pack()會按照解包格式將字串在記憶體中的二進位制重新解釋(說的感覺不太好...,見下例)
'''print
'大端:',hex(unpack('>i',a)[0])#因為pack返回的是元組,即使只有乙個元素也是元組的形式
print
'小端:',hex(unpack(',a)[0])
if __name__ == "__main__":
print
'判斷本機是否為大小端?',
isbig_endian()
fun_calcsize()
print
'大端:'
format = ">ii"
fun_pack(format)
fun_pack_into(format)
print
'小端:'
format = "fun_pack(format)
fun_pack_into(format)
print
'test'
test()
'''result:
判斷本機是否為大小端? 本機為小端
ci: 8
@ci: 8
=ci: 5
>ci: 5
ic: 5
0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
unpack 0x11223344 0x55667788
pack_into 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
pack_from 0x11223344 0x55667788
小端:pack 0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55
unpack 0x11223344 0x55667788
pack_into 0x44 0x33 0x22 0x11 0x88 0x77 0x66 0x55
pack_from 0x11223344 0x55667788
test
字元1的二進位制: 0x31
字元2的二進位制: 0x32
字元3的二進位制: 0x33
字元4的二進位制: 0x34
大端:0x31323334
小端:0x34333231
'''
Python學習筆記 內建方法
官方文件 標準io string input enter something print string enter something hello hello chr ascii碼轉字元 ord 字元轉ascii碼 print chr 48 ord 0 0 48 eval 執行字串形式的單個表示式 ...
Python學習筆記 六 再談Python模組
python程式包含多個模組檔案,乙個主體 頂層檔案實現主要控制流程 呼叫元件和工具,其他模組檔案則提供元件和工具,python自帶了許多實用的模組稱為標準鏈結庫。模組是python中最高端別的程式組織單元,將 和資料封裝起來以便重用。每乙個檔案都是乙個模組,並且可以通過 匯入 來使用其他模組的變數...
Python學習筆記四(Python OS模組)
python os模組提供了乙個統一的作業系統介面函式,通過python os模組可以實現對系統本身的命令,檔案,目錄進行操作,官方參考文件 1 os.sep 可以取代作業系統特定的路徑分割符 在linux unix下它是 在windows下它是 而在mac os下它是 os.sep 在linux返...