SWIG 中的多字节“OUTPUT”参数?

问题描述 投票:0回答:1

我有一个 C 库,它有 3 个函数(所有参数都是固定长度

uint8_t*
,长度在编译时已知):

  • 只有 2 个输出参数
  • 有 1 个输入参数和 2 个输出参数
  • 有 2 个输入参数和 1 个输出参数

我正在尝试为此 C 库创建基于 SWIG 的 Python 绑定,但它们似乎不起作用。即使在导入

typemaps.i
后,swig 仍然会在尝试调用该函数时抱怨 a
bytearray
不适合
uint8_t INOUT[]
参数。

我不明白。我做错了什么?

https://www.swig.org/Doc4.1/Python.html#Python_nn46

请注意

INPUT
参数如何允许传递整数值而不是指针,以及
OUTPUT
参数如何创建返回结果。

如果您不想使用名称

INPUT
OUTPUT
,请使用 %apply 指令。

看起来

%pybuffer_mutable_binary
不是正确的选择,因为它需要一个尺寸参数,而我的界面没有一个。


附录:代码

SWIG 模块

%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]'
python swig swig-typemap
1个回答
0
投票

您尚未创建类型映射,您需要类型映射。

SWIG 文档中有此类型映射的示例,您应该使用

pybuffer.i
类型映射。

这个答案有一个例子:Pass Python bytes to C/C++ function using swig?

© www.soinside.com 2019 - 2024. All rights reserved.