2012-04-12 12 views
3

In C# Ich habe ein Attribut deklariert als:Wie lese ich von einem öffentlichen festen Byte in IronPython?

public fixed byte foo[10] 

Im Client-Code, den ich sehe es diese Funktion, um Zeichenfolge zu konvertieren verwendet:

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

In Irondruck es mir die Art gegeben, wie eine Zeichenfolge:

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

Der Versuch, die Konvertierungsfunktion zu verwenden, gibt einen Fehler aus.

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

Wie liest man dieses Attribut in IronPython korrekt?

+0

Was ist Cchar? Ich kann keinen Bezug finden für das, was es sein soll. Oder meintest du nur Char? –

+0

Cchar ist Byte, er hat vergessen, mit Hilfe von Cchar = System.Byte; in der Frage. Ersetzung seiner öffentlichen festen Cchar foo [10] mit öffentlichen festen Byte foo [10] – Joe

+0

Ich änderte die Frage in die Verwendung von "Byte". –

Antwort

6

Feste Felder in .NET sind etwas ganz Besonderes. Ein festgelegtes Feld, das Sie haben (public fixed byte foo[10]), wird in eine spezielle verschachtelte Struktur kompiliert, und der Typ Ihres festen Feldes wird in diese verschachtelte Struktur geändert. Kurz gesagt, dieses:

public fixed byte foo[10]; 

erhält in dieser zusammengestellt:

// 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; 

Sie diese mit einem Tool wie ILSpy selbst sehen können.

Nun, wenn der Code in C# eine Linie hat GetString(obj.foo) es kompiliert wird in:

GetString(&obj.foo.FixedElementField); 

so wörtlich er die Adresse des ersten Elements des Arrays nimmt und leitet es als Parameter der Methode (daher ist der GetString Parameter vom richtigen Typ, byte*).

Wenn Sie die gleiche Methode mit dem gleichen Parameter in IronPython aufrufen, ist der Parametertyp immer noch der Typ Ihres Felds: <foo>e__FixedBuffer0, das nicht in byte* (offensichtlich) umgewandelt werden kann. Die richtige Methode, um diesen Methodenaufruf zu machen, wäre dieselbe Ersetzung wie der C# -Compiler - nehmen Sie die Adresse FixedElementField und übergeben Sie sie an die GetString, aber leider hat Python (nach meinem Wissen) kein Analog zu der & Operator in C#.

Die Schlussfolgerung wäre: Sie können nicht direkt auf ein festes Feld von IronPython zugreifen. Ich würde sagen, dass die beste Wahl ist, eine „Proxy“ Methode zu haben, wie:

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

PS Ich bin kein Profi Ironpython, so vielleicht gibt es einen Super-Weg ist direkt auf den foo prop zugreifen, aber ich nur sehe nicht wie.

Verwandte Themen