使用 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#", charstate
python字符串时,它看起来像:
ret="\00\03\00\00\00\x11\00\00\00\x22\x02\00"
# len(ret)=12 - 12 bytes!
那么您必须将每个字节一个字节地转换为一个整数,并将每个字节的结果乘以 8(或乘以 2^8)到某个累加器以获得结果值。