7

辞書で構造を初期化する方法があります。

fooData= {'y': 1, 'x': 2}
fooStruct = ffi.new("foo_t*", fooData)
fooBuffer = ffi.buffer(fooStruct)

変換を行う準備ができている関数はありますか?

fooStruct = ffi.new("foo_t*")
(ffi.buffer(fooStruct))[:] = fooBuffer
fooData= convert_to_python( fooStruct[0] )    

自分で ffi.typeof("foo_t").fields を使用する必要がありますか?

これまでのところ、このコードを思いつきました:

def __convert_struct_field( s, fields ):
    for field,fieldtype in fields:
        if fieldtype.type.kind == 'primitive':
            yield (field,getattr( s, field ))
        else:
            yield (field, convert_to_python( getattr( s, field ) ))

def convert_to_python(s):
    type=ffi.typeof(s)
    if type.kind == 'struct':
        return dict(__convert_struct_field( s, type.fields ) )
    elif type.kind == 'array':
        if type.item.kind == 'primitive':
            return [ s[i] for i in range(type.length) ]
        else:
            return [ convert_to_python(s[i]) for i in range(type.length) ]
    elif type.kind == 'primitive':
        return int(s)

もっと速い方法はありますか?

4

3 に答える 3

4

Arpegiusのソリューションは私にとってはうまく機能し、非常にエレガントです。inspect を使用するという Selso の提案に基づいたソリューションを実装しました。dir() は inspect を置き換えることができます。

from inspect import getmembers
from cffi import FFI
ffi = FFI()
from pprint import pprint

def cdata_dict(cd):
    if isinstance(cd, ffi.CData):
        try:
            return ffi.string(cd)
        except TypeError:
            try:
                return [cdata_dict(x) for x in cd]
            except TypeError:
                return {k: cdata_dict(v) for k, v in getmembers(cd)}
    else:
        return cd

foo = ffi.new("""
struct Foo {
    char name[6];
    struct {
        int a, b[3];
    } item;
} *""",{
    'name': b"Foo",
    'item': {'a': 3, 'b': [1, 2, 3]}
})
pprint(cdata_dict(foo))

出力:

{'item': {'a': 3, 'b': [1, 2, 3]}, 'name': b'Foo'}
于 2019-02-17T12:17:40.610 に答える
0

あなたのコードは問題ありません。

CFFIに組み込みの方法があったとしても、それはここで必要なものではありません. ffi.new("foo_t*", {'p': p1})確かに、別の cdataがどこにあるかを言うことはできますp1が、より多くの辞書を含む辞書を再帰的に渡すことはできません。同じことが反対方向にも当てはまります。フィールド名を「値」にマップする辞書を取得しますが、値自体はいずれにせよ、より多くの cdata オブジェクトになり、再帰的により多くの辞書にはなりません。

于 2013-12-08T21:50:18.130 に答える