-2

我正在尝试在 C 中为 python 构建一个模块。该模块有几行和方法,但最重要的一个是将 uint32_t 数组串联的整数表示有效地传递给 python。例如,从下面的代码

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

我希望在 python 中,该十六进制元素的连接的整数表示为 0x000003000000110000022200 = 14167099467300633453056。如您所见,我尝试使用“s#”,但没有成功。请给我一个建议好吗?

4

1 回答 1

2

使用 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

如果我的整数是“大”整数,您认为正确的类型是什么?

如果该值超过 64 位,则没有“正确”类型。是这样,将计算移到python端。

如果您想要在 python 端的单个值14167099467300633453056,那么 C 中最广泛的可用类型无法适应它 -unsigned long long具有(至少)64 位,而该值预计具有 96 位。我建议要么:

  • 向右移动 32 或乘以 2^32 将上述代码在 python 端的结果值,因为 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 端的数字,这类似于int("3000000110000022200", 16)python。

我希望在 python 中,该十六进制元素的连接的整数表示为 0x000003000000110000022200

memcpy一个小端系统之后,内容charstate将是:

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

在调用Py_BuildValue("s#", charstatepython字符串时,它看起来像:

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

那么您必须将每个字节一个字节地转换为一个整数,并将每个字节的结果乘以 8(或乘以 2^8)到某个累加器以获得结果值。

于 2021-01-15T09:27:16.650 回答