python學習筆記7 5 內建模組struct

2021-07-31 03:57:33 字數 4153 閱讀 3392

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返...