當前位置:首頁 » 編程語言 » structpython

structpython

發布時間: 2022-08-22 09:16:26

python中的struct模塊中pack參數個數限制

struct.pack 函數後面的可變長參數沒有參數長度的限制。


另外,如果你已經將所需的參數放入一個叫args 的 tuple中,那麼可以用下面的方法傳給 pack 函數:

args=("H","elloworld",5)
struct.pack("c12si",*args)
#等價於
struct.pack("c12si","H","elloworld",5)

② Python中如何使用C的結構體struct求解

閟truct就可以使用結構體了:
import struct
生成一個結構體實例:
data = struct.pack( 'format_string', struct_menber_1, struct_menber_2, ... )
其中的format_string用來指定結構體的格式(指明該結構體在C中的定義),由兩部分組成:
首先是一個可選的特殊字元,用來指明位元組序、數據類型大小和對齊方式:
@: native order, size & alignment (default)
=: native order, std. size & alignment
<: little-endian, std. size & alignment
>: big-endian, std. size & alignment
!: same as >
然後是指明結構體定義的部分:
The remaining chars indicate types of args and must match exactly;
these can be preceded by a decimal repeat count:
x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
h:short; H:unsigned short; i:int; I:unsigned int;
l:long; L:unsigned long; f:float; d:double.
Special cases (preceding decimal count indicates length):
s:string (array of char); p: pascal string (with count byte).
Special case (only available in native format):
P:an integer type that is wide enough to hold a pointer.
Special case (not in native mode unless 'long long' in platform C):
q:long long; Q:unsigned long long
Whitespace between formats is ignored.
如果struct模塊的函數出錯,將產生struct.error異常。

③ python3 利用struct.pack 動態組建位元組流

a = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
fmt = str(len(a)) + 'H' # 默認小端模式
struct.pack(fmt, *a) # 列表a前面加*,表示將a解壓後單個傳入參數
推理:a如果是動態變化的list,或者動態截取a其中一段來轉換成位元組流都是可以的

④ python struct模塊使用問題

when you pack a struct, you need to give it the format you need:

Check it here : http://www.python.org/doc//current/library/struct.html

In your case, you should

pack('BBHHHLL', a,b,c,d,e,f,g) # assuming all are unsigned.

⑤ python中的struct模塊怎麼使用

  • Python為各種數據類型(如整型等)提供與「C」不同的抽象層次,它們也以不同的方式存儲它們。當然,存儲在二進制文件中的數據或通過網路發送和接收的數據是連續的位元組。在Python中,列表中的數據可能不會被存儲為連續的位元組塊。

  • 2

    為了處理它們,將python值轉換為「C」結構很重要,即將它們打包成連續的數據位元組,或者將一個連續的位元組塊分解成Python對象。模塊「struct」提供了將python對象打包為連續的位元組塊的功能,或者將一大塊位元組拆分成python結構。

⑥ python struct 格式符b 為什麼是兩個位元組

整個代碼是把data每兩個字元變成一個位元組,比如"7F"變成一個值127的byte。struct.pack()參數B指按Byte轉換。輸出的byte_dat是一個位元組串,類似b"\xEF"。
+號的含義因該是拼接,把後轉換的一個位元組拼接在之前積累的數據後面。b""前綴是位元組串,不是字元串。

⑦ 關於python代碼中struct模塊的定義

這個你得好好看看struct模塊的pack函數的文檔了,fmt就是format,pack的第一個參數代表了格式的信息,這個格式的格式,有專門的定義

⑧ python struct pack怎麼弄成二進制

有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體.
struct模塊中最重要的三個函數是pack(), unpack(), calcsize()
8

# 按照給定的格式(fmt),把數據封裝成字元串(實際上是類似於c結構體的位元組流)pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析位元組流string,返回解析出來的tupleunpack(fmt, string) # 計算給定的格式(fmt)佔用多少位元組的內存calcsize(fmt)

上述fmt中,支持的格式為:

FORMAT
C TYPE
PYTHON TYPE
STANDARD SIZE
NOTES

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.q和Q只在機器支持64位操作時有意思
注2.每個格式前可以有一個數字,表示個數
注3.s格式表示一定長度的字元串,4s表示長度為4的字元串,但是p表示的是pascal字元串
注4.P用來轉換一個指針,其長度和機器字長相關
注5.最後一個可以用來表示指針類型的,佔4個位元組
為了同c中的結構體交換數據,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第一個字元來改變對齊方式.定義如下:

CHARACTER
BYTE ORDER
SIZE
ALIGNMENT

@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none
使用方法是放在fmt的第一個位置,就像』@5s6sif』
例子1:
結構體如下:

structHeader{ unsigned shortid; char[4] tag; unsigned intversion; unsigned intcount;}

通過socket.recv接收到了一個上面的結構體數據,存在字元串s中,現在需要把它解析出來,可以使用unpack()函數:

importstructid, tag, version, count =struct.unpack("!H4s2I", s)

上面的格式字元串中,!表示我們要使用網路位元組順序解析,因為我們的數據是從網路中接收到的,在網路上傳送的時候它是網路位元組順序的.後面的H表示 一個unsigned short的id,4s表示4位元組長的字元串,2I表示有兩個unsigned int類型的數據.
就通過一個unpack,現在id, tag, version, count里已經保存好我們的信息了.
同樣,也可以很方便的把本地數據再pack成struct格式:

ss =struct.pack("!H4s2I", id, tag, version, count);

pack函數就把id, tag, version, count按照指定的格式轉換成了結構體Header,ss現在是一個字元串(實際上是類似於c結構體的位元組流),可以通過 socket.send(ss)把這個字元串發送出去。
例子2:

importstruct a=12.34 # 將a變為二進制bytes=struct.pack('i',a)

此時bytes就是一個string字元串,字元串按位元組同a的二進制存儲內容相同。
再進行反操作,現有二進制數據bytes,(其實就是字元串),將它反過來轉換成python的數據類型:

# 注意,unpack返回的是tuple !!a,=struct.unpack('i',bytes)

如果是由多個數據構成的,可以這樣:

a='hello'b='world!'c=2d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)

此時的bytes就是二進制形式的數據了,可以直接寫入文件比如 binfile.write(bytes)
然後,當我們需要時可以再讀出來,bytes=binfile.read()
再通過struct.unpack()解碼成python變數:

a,b,c,d=struct.unpack('5s6sif',bytes)

』5s6sif』這個叫做fmt,就是格式化字元串,由數字加字元構成,5s表示佔5個字元的字元串,2i,表示2個整數等等,下面是可用的字元及類型,ctype表示可以與python中的類型一一對應。
注意:二進制文件處理時會碰到的問題
我們使用處理二進制文件時,需要用如下方法:

binfile=open(filepath,'rb') #讀二進制文件 binfile=open(filepath,'wb') #寫二進制文件

那麼和binfile=open(filepath,』r')的結果到底有何不同呢?
不同之處有兩個地方:
第一,使用』r'的時候如果碰到』0x1A』,就會視為文件結束,這就是EOF。使用』rb』則不存在這個問題。即,如果你用二進制寫入再用文本讀出的話,如果其中存在』0X1A』,就只會讀出文件的一部分。使用』rb』的時候會一直讀到文件末尾。
第二,對於字元串x=』abc\ndef』,我們可用len(x)得到它的長度為7,\n我們稱之為換行符,實際上是』0X0A』。當我們用』w'即文本方式寫的時候,在windows平台上會自動將』0X0A』變成兩個字元』0X0D』,』0X0A』,即文件長度實際上變成8.。當用』r'文本方式讀取時,又自動的轉換成原來的換行符。如果換成』wb』二進制方式來寫的話,則會保持一個字元不變,讀取時也是原樣讀取。所以如果用文本方式寫入,用二進制方式讀取的話,就要考慮這多出的一個位元組了。』0X0D』又稱回車符。linux下不會變。因為linux只使用』0X0A』來表示換行。

⑨ Python中struct.pack的一個疑問

的確很奇怪。我試驗了10幾分鍾,你按下面的方法來做就可以正確。

importstruct
zzz=("{Type:2}").encode("utf-8")
length=len(zzz)
a=struct.pack("%ds"%length,zzz)
print(a)

簡單的說s其實只是一個字元,所以前面要加一個數字,比如8s,就可以存貯一個長度為8的字元串。你只寫一個s當然只存貯一個。


python幫助的原文如下

For the 's' format
character, the count is interpreted as the size of the string, not a repeat
count like for the other format characters; for example, '10s' means a single
10-byte string, while '10c' means 10 characters. If a count is not given, it
defaults to 1. For packing, the string is truncated or padded with null bytes as
appropriate to make it fit. For unpacking, the resulting string always has
exactly the specified number of bytes. As a special case, '0s' means a single, empty
string (while '0c'
means 0 characters).

熱點內容
手機上怎麼打開壓縮文件 發布:2024-05-04 17:03:57 瀏覽:171
word加密文件如何解密 發布:2024-05-04 17:02:57 瀏覽:289
php源碼本地測試 發布:2024-05-04 16:57:17 瀏覽:800
c語言編譯exe 發布:2024-05-04 16:57:16 瀏覽:974
國密演算法獲取 發布:2024-05-04 16:38:24 瀏覽:70
腳本精靈荒野亂斗 發布:2024-05-04 16:28:33 瀏覽:520
剛到的筆記本怎麼看配置 發布:2024-05-04 16:26:58 瀏覽:4
蘋果7怎麼給支付寶加密碼 發布:2024-05-04 16:13:12 瀏覽:405
sql培訓視頻 發布:2024-05-04 16:00:59 瀏覽:263
極無雙平新伺服器什麼時候出 發布:2024-05-04 15:50:47 瀏覽:662