簡體   English   中英

使用 Python.h 將 uint32_t 數組傳遞給 Python

[英]Passing uint32_t array to Python using Python.h

我正在嘗試為 C 中的 python 構造一個模塊。該模塊有幾行和方法,但最重要的方法之一是有效地傳遞 integer 表示將 uint32_t 數組連接到 python。例如,從代碼以下

{
    uint32_t state[3] = {0x00000300, 0x00001100, 0x00022200}
    char charstate[12];
    memcpy(charstate, state, 12);
    return Py_BuildValue("s#", charstate, 12);
}

我希望在 python 中 integer 表示十六進制元素的串聯,即 0x000003000000110000022200 = 14167099467300633453056。如您所見,我嘗試使用“#”,但沒有成功。 你能給我一個建議嗎?

使用 Python.h 將 uint32_t 數組傳遞給 Python

我只想做一個數組,就像你在 C 中所做的那樣。

uint32_t state[3] = {0x00000300, 0x00001100, 0x00022200}
return Py_BuildValue("[k,k,k]", 
       (unsigned long)state[0],
       (unsigned long)state[1],
       (unsigned long)state[2]);

unsigned long是一種寬度足以存儲uint32_t的類型。

如果我的 integer 是“大”integer,您認為正確的類型是什么?

如果該值超過 64 位,則沒有“正確”類型。 是這樣,把計算移到python這邊。

如果您想要 python 端的單個值14167099467300633453056 ,那么 C 中最廣泛的可用類型不適合它 - unsigned long long有(至少)64 位,而該值預計有 96 位。 我建議:

  • 將上述代碼在 python 側的結果值向右移動 32 或乘以 2^32,因為 python 支持任意數字范圍,或者
  • 將 3 個值轉換為其字符串表示並將該 C 字符串轉換為 python 字符串

char buffer[200];
int len = snprintf(buffer, sizeof(buffer), 
     "%16"PRIx32"%016"PRIx32"%016"PRIx32,
     state[0], state[1], state[2]);
Py_BuildValue("#s", buffer, len);

然后將結果值轉換為 python 端的數字,這類似於 python 中的int("3000000110000022200", 16)

我希望在 python 中 integer 表示十六進制元素的串聯,即 0x000003000000110000022200

小端系統上執行memcpy之后, charstate的內容將是:

char charstate[12] = {
    0x00, 0x03, 0x00, 0x00,
    0x00, 0x11, 0x00, 0x00, 
    0x00, 0x22, 0x02, 0x00 };

在調用Py_BuildValue("s#", charstate to a python string時,它看起來像:

ret="\00\03\00\00\00\x11\00\00\00\x22\x02\00"
# len(ret)=12 - 12 bytes!

那么你必須將每個字節逐字節轉換為 integer 並將每個字節的結果移動 8(或乘以 2^8)到某個累加器以獲得結果值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM