簡體   English   中英

如何從IronPython中的公共固定字節讀取?

[英]How do I read from a public fixed byte in IronPython?

在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中的固定字段非常特殊。 您擁有的固定字段( public fixed byte 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 ,它不能轉換為byte* (顯然)。 調用此方法的正確方法是執行與C#編譯器相同的替換 - 獲取FixedElementField的地址並將其傳遞給GetString ,但不幸的是,Python(據我所知)沒有模擬& C#中的運算符。

結論是:您不能直接從IronPython訪問固定字段。 我想說你最好的選擇就是采用“代理”方法:

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

PS我不是IronPython專業人士,所以也許有一種超級方式可以直接訪問foo prop,但我只是不知道如何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM