Python 中文開發手冊
struct (String) - Python 中文開發手冊
該模塊執行Python值與C結構之間的轉換,表示為Python字符串。這可用于處理存儲在文件或網絡連接中的二進制數據以及其他來源。它使用格式字符串作為C結構布局的緊湊描述,以及從Python值轉換的預期轉換。
struct打包,注意
默認情況下,打包給定C結構的結果包括填充字節,以便為所涉及的C類型保持正確的對齊; 同樣,開箱時要考慮到對齊。選擇此行為以使打包結構的字節完全對應于相應C結構的內存中的布局。要處理與平臺無關的數據格式或省略隱式填充字節,請使用standard大小和對齊而不是native大小和對齊:有關詳細信息,請參閱字節順序,大小和對齊。
1.功能和例外
該模塊定義了以下異常和功能:
struct和typedef,exception struct.error
在各種場合提出例外; 參數是描述錯誤的字符串。
struct.pack(fmt, v1, v2, ...)
根據給定的格式返回一個包含值v1,v2,...的字符串。 參數必須完全匹配格式所需的值。
python unpack、struct.pack_into(fmt, buffer, offset, v1, v2, ...)
v1, v2, ...按照給定的格式打包值,將打包字節寫入從偏移量開始的可寫緩沖區。請注意,偏移量是必需的參數。
2.5版本中的新功能。
struct.unpack(fmt, string)
php pack,根據給定的格式解壓字符串(大概是用pack(fmt,...)打包)。 結果是一個元組,即使它只包含一個項目。 該字符串必須包含格式所需的數據量(len(string)必須等于calcsize(fmt))。
struct.unpack_from(fmt, buffer[, offset=0])
按照給定的格式打開緩沖區。 結果是一個元組,即使它只包含一個項目。 緩沖區必須至少包含格式所需的數據量(len(buffer [offset:])必須至少是calcsize(fmt))。
2.5版本中的新功能。
python binascii。struct.calcsize(fmt)
返回與給定格式相對應的結構體的大小(以及字符串的大小)。
2.格式化字符串
格式字符串是在打包和解包數據時用于指定預期布局的機制。它們由格式字符構成,它指定了打包/解壓縮數據的類型。另外,還有用于控制字節順序,大小和對齊的特殊字符。
int python?2.1 字節順序,大小和對齊
默認情況下,C類型以機器的本機格式和字節順序表示,并在必要時通過跳過填充字節(根據C編譯器使用的規則)進行適當對齊。
或者,根據下表,格式字符串的第一個字符可用于指示打包數據的字節順序,大小和對齊方式:
字符
python ctypes?字節順序
大小
對準@
本地
struct。本地
本地
=
本地
python中的string、標準
沒有
<
小--尾數
標準
沒有
大端
標準
沒有
!
網絡(= big-endian)
標準
沒有
如果第一個字符不是其中之一,則假定為“@”。
本地字節順序是大端或小端,取決于主機系統。例如,Intel x86和AMD64(x86-64)是小端的; 摩托羅拉68000和PowerPC G5是高端的; ARM和Intel Itanium具有可切換的字節序(雙字節序)。使用sys.byteorder來檢查你的系統的字節序。
原生大小和對齊是使用C編譯器的sizeof表達式確定的。這總是與本地字節順序相結合。
標準尺寸僅取決于格式字符; 請參閱格式字符部分中的表格。
注意'@'和'='之間的差別:都使用本地字節順序,但后者的大小和對齊是標準化的。
表單'!'適用于那些聲稱自己不記得網絡字節順序是大端還是小端的窮人。
沒有辦法指示非本地字節順序(強制字節交換); 使用''的適當選擇。
注意:
1. 填充只會自動添加在連續的結構成員之間。在編碼結構的開頭或結尾不添加填充。
2. 使用非原生大小和對齊時,例如'','='和'!'不會添加填充。
3. 要將結構的末尾與特定類型的對齊要求對齊,請使用重復計數為零的該類型的代碼結束格式。參見示例。
2.2 格式化字符
格式字符具有以下含義; 考慮到它們的類型,C和Python值之間的轉換應該是顯而易見的。 “標準大小”欄是指使用標準大小時打包值的大小(以字節為單位); 也就是說,當格式字符串以'','!'之一開始時 或'='。 使用原生尺寸時,打包值的大小取決于平臺。
格式
C 類型
Python 類型
標準大小
注意x
pad byte
no value
?
?
c
char
string of length 1
1
?
b
signed char
integer
1
(3)
B
unsigned char
integer
1
(3)
?
_Bool
bool
1
(1)
h
short
integer
2
(3)
H
unsigned short
integer
2
(3)
i
int
integer
4
(3)
I
unsigned int
integer
4
(3)
l
long
integer
4
(3)
L
unsigned long
integer
4
(3)
q
long long
integer
8
(2), (3)
Q
unsigned long long
integer
8
(2), (3)
f
float
float
4
(4)
d
double
float
8
(4)
s
char[]
string
?
?
p
char[]
string
?
?
P
void *
integer
?
(5), (3)
注意:
1. '?' 轉換代碼對應于由C99定義的_Bool類型。 如果此類型不可用,則使用char模擬它。 在標準模式下,它總是由一個字節表示。
2.6版本中的新功能。
2. 將'q'和'Q'只有在平臺C編譯器支持C轉換代碼在本地模式中可用long long,或者在Windows上,__int64。它們始終可用于標準模式。
2.2版本中的新功能。
3. 當嘗試使用任何整數轉換代碼打包非整數時,如果非整數具有__index __()方法,則在打包之前調用該方法將參數轉換為整數。 如果不存在__index __()方法,或者對__index __()的調用引發TypeError,則嘗試__int __()方法。 但是,__int __()的使用已被棄用,并且會引發DeprecationWarning。
在版本2.7中更改:對非整數使用__index __()方法是2.7中的新功能。2.7版中的更改:在版本2.7之前,并非所有整數轉換代碼都會使用__int __()方法進行轉換,并且引發了DeprecationWarning 僅用于float參數。
4. 對于'f'和'd'轉換碼,填充表示使用IEEE 754 binary32(對于'f')或binary64(對于'd')格式,而不管由所述平臺中使用的浮點格式的。
5. 該'P'格式字符僅適用于本地字節順序(選擇為默認或與'@'字節順序字符)。字節順序字符'='選擇使用基于主機系統的小端或大端排序。結構模塊不會將其解釋為本地排序,因此該'P'格式不可用。
格式字符之前可以有一個整數重復計數。 例如,格式字符串'4h'的含義與'hhhh'完全相同。
格式之間的空格字符被忽略; 計數及其格式不能包含空格。
對于's'格式字符,計數被解釋為字符串的大小,而不是像其他格式字符一樣重復計數; 例如,'10s'表示單個10字節的字符串,而'10c'表示10個字符。 如果沒有給出計數,則默認為1.對于打包,字符串將被截斷或填充為空字節,以使其合適。 對于解包,結果字符串總是具有指定的字節數。 作為一個特殊情況,'0'表示單個空字符串(而'0c'表示0個字符)。
'p'格式字符編碼一個“Pascal字符串”,意思是一個簡短的可變長度字符串,存儲在固定數量的字節中,由count給出。 存儲的第一個字節是字符串的長度,或255,以較小者為準。 字符串的字節在后面。 如果傳遞給pack()的字符串太長(比計數減1還長),則僅存儲字符串的前導count-1字節。 如果字符串比count-1短,則會填充空字節,以便使用全部的精確計數字節。 請注意,對于unpack(),'p'格式字符會消耗計數字節,但返回的字符串不能包含超過255個字符。
對于'P'格式字符,返回值是一個Python整數或長整數,具體取決于指針轉換為整型時所需的大小。一個NULL指針將總是作為Python整數返回0。當打包指針大小的值時,可以使用Python整數或長整數對象。例如,Alpha和Merced處理器使用64位指針值,這意味著Python長整數將用于保存指針; 其他平臺使用32位指針并將使用Python整數。
為了 '?' 格式字符,返回值是True或False。 打包時,使用參數對象的真值。 原生或標準bool表示中的0或1將被打包,并且在解包時任何非零值都將為True。
2.3 例子
注意
所有的例子都假設了一個本地字節順序,大小,并與一個big-endian機器對齊。
打包/解包三個整數的基本示例:
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8
解包字段可以通過將它們分配給變量或通過將結果包裝到指定的元組中來命名:
>>> record = 'raymond \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)
>>> from collections import namedtuple
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._make(unpack('<10sHHb', record))
Student(name='raymond ', serialnum=4658, school=264, gradelevel=8)
格式字符的排序可能會影響大小,因為滿足對齊要求所需的填充是不同的:
>>> pack('ci', '*', 0x12131415)
'*\x00\x00\x00\x12\x13\x14\x15'
>>> pack('ic', 0x12131415, '*')
'\x12\x13\x14\x15*'
>>> calcsize('ci')
8
>>> calcsize('ic')
5
以下格式'llh0l'在末尾指定兩個填充字節,假定長度在4個字節的邊界上對齊:
>>> pack('llh0l', 1, 2, 3)
'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
這只適用于本地大小和對齊有效的情況; 標準尺寸和對齊不強制任何對齊。
擴展內容
Module array 打包的二進制存儲的同質數據。 Module xdrlib 打包和解壓XDR數據。
3.類
該struct模塊還定義了以下類型:
class struct.Struct(format)
返回一個新的Struct對象,它根據格式字符串格式寫入和讀取二進制數據。 創建一個Struct對象并調用它的方法比使用相同格式調用結構函數更有效率,因為格式字符串只需編譯一次。
2.5版本中的新功能。
編譯結構對象支持以下方法和屬性:
pack(v1, v2, ...)
與該pack()函數相同,使用編譯后的格式。(len(result)將等于self.size。)
pack_into(buffer, offset, v1, v2, ...)
與該pack_into()函數相同,使用編譯后的格式。
unpack(string)
與該unpack()函數相同,使用編譯后的格式。(len(string)必須等于self.size)。
unpack_from(buffer, offset=0)
與該unpack_from()函數相同,使用編譯后的格式。(len(buffer[offset:])至少必須是self.size)。
format
用于構造此Struct對象的格式字符串。
size
計算出的結構體(以及字符串)的大小對應于format。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态