gpt4 book ai didi

python - 在Python的C api中解析无符号整数(uint32_t)

转载 作者:行者123 更新时间:2023-11-30 15:18:35 27 4
gpt4 key购买 nike

如果我编写一个接受单个无符号整数(0 - 0xFFFFFFFF)的函数,我可以使用:

uint32_t myInt;
if(!PyArg_ParseTuple(args, "I", &myInt))
return NULL;

然后从 python 中,我可以传递 intlong

但是如果我传递了一个整数列表怎么办?

uint32_t* myInts;
PyObject* pyMyInts;
PyArg_ParseTuple(args, "O", &pyMyInts);

if (PyList_Check(intsObj)) {
size_t n = PyList_Size(v);
myInts = calloc(n, sizeof(*myInts));

for(size_t i = 0; i < n; i++) {
PyObject* item = PyList_GetItem(pyMyInts, i);

// What function do I want here?
if(!GetAUInt(item, &myInts[i]))
return NULL;
}
}

// cleanup calloc'd array on exit, etc

具体来说,我的问题是处理:

  • 包含 intlong 混合的列表
  • 分配给 uint32 时检测溢出

最佳答案

您可以创建一个元组并使用与单个参数相同的方法。在 C 端,元组对象并不是真正不可变的,因此不会太麻烦。

还有PyLong_AsUnsignedLong可以为你工作。它接受 int 和 long 对象,否则会引发错误。但如果 sizeof(long) 大于 4,您可能需要自己检查上限溢出。

static int 
GetAUInt(PyObject *pylong, uint32_t *myint) {
static unsigned long MAX = 0xffffffff;
unsigned long l = PyLong_AsUnsignedLong(pylong);

if (l == -1 && PyErr_Occurred() || l > MAX) {
PyErr_SetString(PyExc_OverflowError, "can't convert to uint32_t");
return false;
}

*myint = (uint32_t) l;
return true;
}

关于python - 在Python的C api中解析无符号整数(uint32_t),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31338326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com