struct來處理C語言中的結構體

2021-07-27 05:51:06 字數 1652 閱讀 1914

有的時候需要用python處理二進位制資料,比如,訪問檔案,socket操作時.這時候,可以使用python的struct模組來完成.可以用 struct來處理c語言中的結構體.

struct模組中最重要的三個函式是pack(), unpack(), calcsize()

pack(fmt, v1, v2, …) 按照給定的格式(fmt),把資料封裝成字串(實際上是類似於c結構體的位元組流)

unpack(fmt, string) 按照給定的格式(fmt)解析位元組流string,返回解析出來的tuple

calcsize(fmt) 計算給定的格式(fmt)占用多少位元組的記憶體

注1.q和q只在機器支援64位操作時有意思

注2.每個格式前可以有乙個數字,表示個數

注3.s格式表示一定長度的字串,4s表示長度為4的字串,但是p表示的是pascal字串

注4.p用來轉換乙個指標,其長度和機器字長相關

注5.最後乙個可以用來表示指標型別的,佔4個位元組

為了同c中的結構體交換資料,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第乙個字元來改變對齊方式.定義如下:

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

import struct

id, 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)把這個字串傳送出去.

示例二:

import struct

a=12.34

將a變為二進位制

bytes=struct.pack(『i』,a)

此時bytes就是乙個string字串,字串按位元組同a的二進位制儲存內容相同。

再進行反操作

現有二進位制資料bytes,(其實就是字串),將它反過來轉換成python的資料型別:

a,=struct.unpack(『i』,bytes)

注意,unpack返回的是tuple

所以如果只有乙個變數的話:

bytes=struct.pack(『i』,a)

那麼,解碼的時候需要這樣

a,=struct.unpack(『i』,bytes) 或者 (a,)=struct.unpack(『i』,bytes)

如果直接用a=struct.unpack(『i』,bytes),那麼 a=(12.34,) ,是乙個tuple而不是原來的浮點數了。

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...

C語言中的struct 記憶體對齊

sizeof計算結構體大小的時候具體是怎樣計算的 記憶體對齊的原則是根據最寬資料型別的大小進行對齊的 struct a 大小是8個位元組要進行記憶體對齊,是根據int 4個位元組對齊的 char short 4位元組 int 4位元組 如上是這樣對齊的 struct a 大小是8個位元組 int 4...