python标准类型内建模块_Python内建模块struct实例详解
本文研究的主要是Python內(nèi)建模塊struct的相關內(nèi)容,具體如下。
Python中變量的類型只有列表、元祖、字典、集合等高級抽象類型,并沒有像c中定義了位、字節(jié)、整型等底層初級類型。因為Python本來就是高級解釋性語言,運行的時候都是經(jīng)過翻譯后再在底層運行。如何打通Python和其他語言之間的類型定義障礙,Python的內(nèi)建模塊struct完全解決了所有問題。
知識介紹:
在struct模塊中最最常用的三個:
(1)struct.pack:用于將Python的值根據(jù)格式符,轉換為字符串(因為Python中沒有字節(jié)(Byte)類型,可以把這里的字符串理解為字節(jié)流,或字節(jié)數(shù)組)。
(2)struct.unpack: 剛好與struct.pack相反,用于將字節(jié)流轉換成python數(shù)據(jù)類型,該函數(shù)返回一個元組。
(3)struct.calcsize: 計算格式字符串所對應的結果的長度。
轉換過程中遇到的格式操作:
格式符
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
實例詳解:
#!/usr/bin/python
# -*- coding:utf-8 -*-
'''測試struct模塊'''
from struct import *
import array
def fun_calcsize():
print 'ci:',calcsize('ci')#計算格式占內(nèi)存大小
print '@ci:',calcsize('@ci')
print '=ci:',calcsize('=ci')
print '>ci:',calcsize('>ci')
print '
print 'ic:',calcsize('ic')#計算格式占內(nèi)存大小
print '@ic:',calcsize('@ic')
print '=ic:',calcsize('=ic')
print '>ic:',calcsize('>ic')
print '
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碼表中的字符轉換成對應的整形,hex將數(shù)值轉化為十六進制
result = unpack(Format,result)
print 'unpack'.ljust(10),str(type(result)).ljust(20),
for i in result:
print hex(i),
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)),
result = unpack_from(Format,r,0)
print 'pack_from'.ljust(10),str(type(result)).ljust(20),
for i in result:
print hex(i),
def IsBig_Endian():
'''判斷本機為大/小端'''
a = 0x12345678
result = pack('i',a)#此時result就是一個string字符串,字符串按字節(jié)同a的二進制存儲內(nèi)容相同。
if hex(ord(result[0])) == '0x78':
print '本機為小端'
else:
print '本機為大端'
def test():
a = '1234'
for i in a:
print '字符%s的二進制:'%i,hex(ord(i))#字符對應ascii碼表中對應整數(shù)的十六進制
'''
不用unpack()返回的數(shù)據(jù)也是可以使用pack()函數(shù)的,只要解包的字符串符合解包格式即可,
pack()會按照解包格式將字符串在內(nèi)存中的二進制重新解釋(說的感覺不太好...,見下例)
'''
print '大端:',hex(unpack('>i',a)[0])#因為pack返回的是元組,即使只有一個元素也是元組的形式
print '小端:',hex(unpack('
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
@ic: 5
=ic: 5
>ic: 5
大端:
pack 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軟件環(huán)境:win10+anaconda3+pycharm,Python版本:3.6
總結
以上就是本文關于Python內(nèi)建模塊struct實例詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
總結
以上是生活随笔為你收集整理的python标准类型内建模块_Python内建模块struct实例详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python limit_Python
- 下一篇: idea 用iterm 终端_帅气逼人的