三步解决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字节对齐问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用linux集成电路版图设计,集成电路版
- 下一篇: c语言soket编程,C语言socket