使用C python api时消息长度不正确
我正在尝试扩展libhydrogen(这里有开源代码:)以支持对Python中底层库的调用。然而,我遇到了一个奇怪的问题。 具体来说,我有以下代码:使用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
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。