Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C python api时消息长度不正确_Python_C_Python C Api_Python Extensions - Fatal编程技术网

使用C python api时消息长度不正确

使用C python api时消息长度不正确,python,c,python-c-api,python-extensions,Python,C,Python C Api,Python Extensions,我正在尝试扩展libhydrogen(这里有开源代码:)以支持对Python中底层库的调用。然而,我遇到了一个奇怪的问题。 具体来说,我有以下代码: static PyObject* crypto_secretbox_encrypt(PyObject* self, PyObject* args){ char* m; size_t mlen; uint64_t msg_id; char *ctx; size_t ctx_len; const uint

我正在尝试扩展libhydrogen(这里有开源代码:)以支持对Python中底层库的调用。然而,我遇到了一个奇怪的问题。 具体来说,我有以下代码:

static PyObject* crypto_secretbox_encrypt(PyObject* self, PyObject* args){
    char* m;
    size_t mlen;
    uint64_t msg_id;
    char *ctx;
    size_t ctx_len;
    const uint8_t *key; //this shouldn't matter its secret
    size_t key_len;
    PyArg_ParseTuple(args, "s#|K|s#|s#", &m, &mlen, &msg_id, &ctx, &ctx_len, &key, &key_len); //only s# accepts null bytes, need to random pointers to store lengths
    //printf("Parsed \n");
    //printf("MSG: %s, MSG_ID: %" PRIu64 ", CTX: %s\n", m, msg_id, ctx);
    if(ctx_len != hydro_secretbox_CONTEXTBYTES){
        PyErr_Format(PyExc_ValueError, "Context not of correct size: Received %lu bytes", ctx_len);
        return NULL;
    }

    if(key_len != hydro_secretbox_KEYBYTES){
        PyErr_Format(PyExc_ValueError, "Key not of correct size: Received %lu bytes", key_len);
        return NULL;
    }
它能够成功解析ctx的长度,但是,当它到达密钥时,会抛出错误

  File "cryptotest.py", line 7, in <module>
    c1 = crypto.secretbox_encrypt("message1", 0, "\x00"*8, '\x00'*32);
ValueError: Key not of correct size: Received 140123308032032 bytes
文件“cryptotest.py”,第7行,在
c1=加密加密盒加密(“消息1”,0,“\x00”*8,\x00'*32);
ValueError:密钥大小不正确:收到140123308032032字节

你知道我为什么无法成功解析密钥长度吗?

你已经将长度指定为
大小\u t
s#
格式不采用
大小
,根据
PY\u-SSIZE\u-CLEAN
宏在包含
Python.h
之前是否为
\define
d

注意:对于所有的
格式变体(
s
y
,等等),长度参数的类型(int或
Py\u ssize\u t
)是通过在包含
Python.h
之前定义宏
Py\u ssize\u CLEAN
来控制的。如果定义了宏,则长度是
Py\u ssize\u t
而不是
int
。在未来的Python版本中,此行为将更改为仅支持
Py_ssize\t
并放弃
int
支持。最好始终定义
PY\u SSIZE\u T\u CLEAN


您已将长度指定为
大小\u t
s#
格式不采用
大小
,根据
PY\u-SSIZE\u-CLEAN
宏在包含
Python.h
之前是否为
\define
d

注意:对于所有的
格式变体(
s
y
,等等),长度参数的类型(int或
Py\u ssize\u t
)是通过在包含
Python.h
之前定义宏
Py\u ssize\u CLEAN
来控制的。如果定义了宏,则长度是
Py\u ssize\u t
而不是
int
。在未来的Python版本中,此行为将更改为仅支持
Py_ssize\t
并放弃
int
支持。最好始终定义
PY\u SSIZE\u T\u CLEAN


谢谢我刚刚意识到我转换到了错误的数据类型,这是一个潜在的问题,我假设在解析数字时,某些类型转换会弄乱数字的值。我找不到关于Py_-ssize_t的文档,但我能直接转换为size_t而没有问题吗?@HansonDuan:与
Py_-ssize_t
文档最接近的是,它指定它与
size_t
大小相同,但有符号,并且在
ssize_t
可用时作为
ssize_t
的typedef。谢谢!我刚刚意识到我转换到了错误的数据类型,这是一个潜在的问题,我假设在解析数字时,某些类型转换会弄乱数字的值。我找不到关于Py_-ssize_t的文档,但是我能不能直接转换为size_t而没有问题?@HansonDuan:与
Py_-ssize_t
文档最接近的是,它指定它与
size_t
大小相同,但有符号,并且在
ssize_t
可用时作为
ssize_t
的typedef。