日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题

發布時間:2025/4/5 python 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python進階篇-struct字節對齊問題

Python進階篇-struct字節對齊問題

Python調用C的時候,會傳遞一些復雜的數據結構,例如結構體,這時候就會遇到各種各樣字節對齊的問題。下邊所有的例子都是在windows 64bit下的結果。

格式字符串

說到這里我們就要來說一下python中的格式字符串,格式字符串顧名思義。就是一個字符串中的每一個字符代表一個數據類型。格式字符串由兩部分構成,第一部分是字節序和對齊方式, 第二步是是具體的數據類型。python中格式字符和對應的數據類型關系如下表。

例如“icc”,就代表要解析的結構體的三個成員數據類型是interger, char, char。

字節序和對齊

字節序和對齊,一共有下表5種方式

默認情況下,字節序和對齊字符是“@”,byte order中native 的意思就是和當前系統大的字節序一致,size如果是native則這個時候數據類型的大小和sizeof是一致的,如果是starndard,則這個時候數據類型的長度是固定的,和格式字符和數據類型中的長度是一致的。alignment是native的話,和當前系統的對齊方式一致。

需要注意的是,alignment是native的時候,字節對齊是和系統一致,但是在python中padding只會在連續的結構體成員之間添加,不會在結構體的開頭和結尾添加

size = struct.calcsize(’@icc’) 結果是6。

size = struct.calcsize(’@cic’) 結果是9。

原因是系統字節對齊是4,第一個c和i之間添加了3個字節padding,但是最后一個c,后邊沒有添加padding,所以結果是9而不是12.

如何解決這個問題?當然有辦法,在格式字符串的最后添加一個“0X”,“X”是一個數據類型,如“l”,代表的就是long,這時候就是指定數據類型,這時候就和C語言中的字節對齊完全一致。

size = size = struct.calcsize(’@cic0i’) 結果是12。

舉個例子

在C代碼中定義結構體:

Struct Person{

int fortune;

char height;

char weight;

};

假設從C代碼中獲取到的結構體數據是buf, 在python中使用struct模塊按照上述的格式解析結構體中的數據。

python中使用struct.unpack(’@icc’, buf);解析結構體數據,這個時候就會報錯。原因就是字節對齊導致兩方的長度不一樣。

size = struct.calcsize(’@icc’) 的結果是6,而sizeof(Person)的長度是8。這樣就會導致解析錯誤。這是后需要指定格式對齊。

struct.unpack("@icc0i",buf)。這樣就能正確解析C語言中的結構體。

希望能對大家有所幫助,祝大家在技術的道路上越走越遠。

Python進階篇-struct字節對齊問題相關教程

總結

以上是生活随笔為你收集整理的三步解决C语言中struct字节对齐问题,Python进阶篇-struct字节对齐问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。