ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何从IronPython中的公共固定字节读取?

2019-08-26 12:07:13  阅读:193  来源: 互联网

标签:python ironpython c-2


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

public fixed byte foo[10]

在客户端代码中,我看到它使用此函数转换为字符串:

public static unsafe string GetString(byte* byteArray)
{
  return new String((sbyte*)byteArray);
}

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

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

尝试使用转换函数会出错.

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

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

解决方法:

.NET中的固定字段非常特殊.您拥有的固定字段(公共固定字节foo [10])将被编译为特殊的嵌套结构,并且固定字段的类型将更改为该嵌套结构.简而言之,这个:

public fixed byte foo[10];

获取编译成:

// This is the struct that was generated, it contains a field with the
// first element of your fixed array
[CompilerGenerated, UnsafeValueType]
[StructLayout(LayoutKind.Sequential, Size = 10)]
public struct <foo>e__FixedBuffer0
{
    public byte FixedElementField;
}

// This is your original field with the new type
[FixedBuffer(typeof(byte), 10)]
public <foo>e__FixedBuffer0 foo;

您可以使用ILSpy之类的工具自己查看.

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

GetString(&obj.foo.FixedElementField);

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

当您在IronPython中使用相同参数调用相同方法时,参数类型仍然是您的字段的类型:< foo> e__FixedBuffer0,无法转换为字节*(显然).调用此方法的正确方法是执行与C#编译器相同的替换 – 获取FixedElementField的地址并将其传递给GetString,但不幸的是,Python(据我所知)没有模拟&安培; C#中的运算符.

结论是:您不能直接从IronPython访问固定字段.我想说你最好的选择就是采用“代理”方法:

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

PS我不是IronPython专业人士,所以也许有一种超级方式可以直接访问foo prop,但我只是不知道如何.

标签:python,ironpython,c-2
来源: https://codeday.me/bug/20190826/1729755.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有