亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ctypes c_uint32 從 python 錯誤地傳遞到 Cpp

ctypes c_uint32 從 python 錯誤地傳遞到 Cpp

斯蒂芬大帝 2023-06-20 10:22:45
我正在使用帶有 ctypes 的 python 來調用 C so 文件。C結構為:typedef struct {uint32_t var1;uint32_t var2;uint32_t var3;uint8_t var4;uint8_t var5} struct1;If I call C code where I set the variables of var1 to 0x050A, var2 to 0x102 and var3 to 0x203 build it and print out the values everything works perfectly.in Cstatic struct1 mstruct;  mstruct.var1=1290  mstruct.var2=258  mstruct.var3=515  然后我調用 ac so file 打印出傳遞給它的結構的值。printf("var1 %lx\n",mstruct.var1) # var1 050A  printf("var2 %lx\n",mstruct.var2) # var2 102  printf("var3 %lx\n",mstruct.var3) # var3 203  請注意,如果我只使用 x 而不是 lx,它不會構建并給出錯誤。但是當從 C 調用時,一切都正確打印出來var1 050Avar2 102var3 203現在,如果我用 python 初始化并調用相同的結構,我將一個類定義為:class struct1(ctypes.Structure):   _fields_=[             ('var1',ctypes.c_uint32),             ('var2',ctypes.c_uint32),             ('var3',ctypes.c_uint32),             ('var4',ctypes.c_uint8),             ('var5',ctypes.c_uint8)]   def __init__(self):         self.var1=1290         self.var2=258         self.var3=515if __name__=='__main__':    mstruct=struct1()    print('var1 {}  type {}'.format(mstruct.var1,type(mstruct.var1)))    clib=ctypes.CDLL('csofile.so')    c_rtn=clib.print_c_struct(ctypes.byref(mstruct))Var1 值是正確的,類型打印為類“int”(不是 ctypes uint32)。在 C so 文件中打印出var1 1020000050avar2 50a00000203var3 20300000102Var1 的最低 16 位是正確的值。中間 16 位用正確的零填充。但是有一個高 32 位來自 var 2 應該在 var1 中的內容。Var2 從 Var3 的值開始。似乎有一個不匹配,就像我的 python 并沒有真正將它定義為 32 位,但更奇怪的是 C 實際上將它讀取為 64 位,我不明白怎么會這樣。由于 C 結構將它定義為 32 位,我希望它只占用 32 位,所以不知何故它被 python 看到了 64 位。如果我將所有內容都更改為 int 它在我的演示應用程序中可以完美運行,但真正的 C so 文件是由其他人創建的,我每隔幾天就會得到一個新文件,所以我盡量避免每次都更改它。當我在init中設置值時,我也嘗試過強制轉換,我想也許我正在覆蓋類型,但這似乎沒有改變任何東西。self.var1=(ctypes_c_uint32)(1290)任何幫助將不勝感激。
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

long在您的系統上是 64 位的,如printf("%lx")打印 64 位整數所示。正如我在評論中看到的那樣,您的 C 代碼uint32_t被定義為unsigned long在該系統上不正確。

您的系統應該有一個為您的操作系統正確stdint.h定義的標頭。uint32_t


查看完整回答
反對 回復 2023-06-20
  • 1 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號