繁体   English   中英

解析python C API中的unsigned ints(uint32_t)

[英]Parsing unsigned ints (uint32_t) in python's C api

如果我写的函数接受单个无符号整数( 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM