如何从IronPython中的公共固定字节读取数据?

2024-09-29 19:04:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在C中,我有一个属性声明为:

public fixed byte foo[10]

在客户端中查看m函数使用的字符串:

^{pr2}$

在IronPython打印中,它给了我一个字符串类型:

>>> print obj.foo
Baz+<foo>e__FixedBuffer1

尝试使用转换函数会出错。在

>>> print GetString(obj.foo)
expected Byte*, got <Foo>e__FixedBuffer1

在IronPython中正确的读取该属性的方法是什么?在


Tags: 函数字符串obj声明客户端类型属性foo
1条回答
网友
1楼 · 发布于 2024-09-29 19:04:16

在.NET中是非常特殊的字段。您拥有的一个固定字段(public fixed byte foo[10])被编译成一个特殊的嵌套结构,而固定字段的类型则被转换成该嵌套结构。简而言之,这:

public fixed byte foo[10];

编译为:

^{pr2}$

您可以使用ILSpy这样的工具亲自查看。在

现在,如果C中的代码有一行GetString(obj.foo),它将被编译成:

GetString(&obj.foo.FixedElementField);

因此,它直接获取数组的第一个元素的地址并将其作为参数传递给方法(因此GetString参数的类型正确,byte*)。在

在IronPython中使用相同的参数调用同一方法时,参数类型仍然是字段的类型:<foo>e__FixedBuffer0,它不能转换为byte*(显然)。进行此方法调用的正确方法是执行与C编译器相同的替换-获取FixedElementField的地址并将其传递给GetString,但不幸的是,Python(据我所知)没有类似于C中的&运算符。在

结论是:您不能直接从IronPython访问固定字段。我想说你最好的办法是使用一种“代理”方法,比如:

public string GetFooString(Baz baz)
{
    return new string((sbyte*)baz.foo);
}

PS我不是一个IronPython专业人士,所以也许有一个超级的方法可以直接访问foo prop,但是我不知道怎么做。在

相关问题 更多 >

    热门问题