我有一个 C 库,它有 3 个函数(所有参数都是固定长度
uint8_t*
,长度在编译时已知):
我正在尝试为此 C 库创建基于 SWIG 的 Python 绑定,但它们似乎不起作用。即使在导入
typemaps.i
后,swig 仍然会在尝试调用该函数时抱怨 a bytearray
不适合 uint8_t INOUT[]
参数。
我不明白。我做错了什么?
https://www.swig.org/Doc4.1/Python.html#Python_nn46
请注意
参数如何允许传递整数值而不是指针,以及INPUT
参数如何创建返回结果。OUTPUT
如果您不想使用名称
或INPUT
,请使用 %apply 指令。OUTPUT
看起来
%pybuffer_mutable_binary
不是正确的选择,因为它需要一个尺寸参数,而我的界面没有有一个。
%module "libmceliece6960119f_clean"
%include "typemaps.i"
%{
// https://github.com/PQClean/PQClean/blob/fb003a2a625c49f3090eec546b2383dcfa2c75d8/crypto_kem/mceliece6960119f/clean/api.h
#include "api.h"
%}
int PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_keypair(
uint8_t INOUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_PUBLICKEYBYTES],
uint8_t INOUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_SECRETKEYBYTES]);
int PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_enc(
uint8_t INOUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_CIPHERTEXTBYTES],
uint8_t INOUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_BYTES],
const uint8_t INPUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_PUBLICKEYBYTES]);
int PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_dec(
uint8_t INOUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_BYTES],
const uint8_t INPUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_CIPHERTEXTBYTES],
const uint8_t INPUT[PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_SECRETKEYBYTES]);
_libmceliece6960119f_clean.PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_keypair()
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_keypair expected 2 arguments, got 0
pk, sk = bytearray(1047319), bytearray(13948); _libmceliece6960119f_clean.PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_keypair(pk, sk)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: in method 'PQCLEAN_MCELIECE6960119F_CLEAN_crypto_kem_keypair', argument 1 of type 'uint8_t [PQCLEAN_MCELIECE6960119F_CLEAN_CRYPTO_PUBLICKEYBYTES]'
您尚未创建类型映射,您需要类型映射。
SWIG 文档中有此类型映射的示例,您应该使用
pybuffer.i
类型映射。