如何将uint8_t从python传递给C?

时间:2018-04-26 16:35:39

标签: python c python-2.7 swig

我在C中有方法,有没有办法将python int转换成uint8_t?

我尝试过ctypes.c_uint8(...),numpy.uint8(...)和struct.pack('B',...),所有这些都抛出'uint8_t'类型的参数1 / p>

python代码是通过swig生成的,python部分看起来像

def hello(value):
    return _swigdemo.hello(value)
hello = _swigdemo.hello

def hello2(value):
    return _swigdemo.hello2(value):
hello2 = _swigdemo.hello2

C代码

uint8_t hello(uint8_t value)
{
    return value;
}

uint8_t * hello2(uint8_t *value)
{
    return value;
}

调用以下方法

import swigdemo
import numpy
import ctypes
import struct

temp = ctypes.c_uint8(5) // or numpy.uint8(5) or struct.pack('B', 5)
swigdemo.hello(temp);

将抛出

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'hello', argument 1 of type 'uint8_t'

1 个答案:

答案 0 :(得分:1)

SWIG不知道uint8_t类型是什么。您可以将typedef unsigned char uint8_t添加到SWIG接口文件以通知它。这是一个独立的例子。注意:%inline声明两个源代码并告诉SWIG将其包装。

%module x

%inline %{
    typedef unsigned char uint8_t;

    uint8_t hello(uint8_t value)
    {
        return value;
    }
%}

演示:

>>> import x
>>> x.hello(5)
5
>>> x.hello(255)
255
>>> x.hello(256)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: in method 'hello', argument 1 of type 'uint8_t'