2012-04-12 74 views
3

在C#中我有一個屬性聲明:如何從IronPython中的公共固定字節讀取數據?

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中讀取這個屬性的正確方法?

+0

什麼是cchar?我無法找到它應該是什麼的參考。還是你的意思是char? – 2012-04-12 15:19:58

+0

cchar是字節,他忘記了用cchar = System.Byte;在問題中。 用公共固定字節foo代替他的公共固定cchar foo [10] [10] – Joe 2012-04-12 19:58:43

+0

我改變了使用'byte'的問題。 – 2012-04-12 21:26:40

回答

6

.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的支柱,但我只是看不到如何。