Frage

Wir haben eine Anwendung, wo wir einige Daten aus einem Stream in mehrere Objekte deserialisieren müssen.

Die Datenmatrix stellt eine Anzahl von Nachrichten variabler Länge zusammengepackt. Es gibt keine Nachrichtencodes in den Strom begrenzen.

Wir wollen etwas tun:

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  

, wo jeder weiß, wo Process Anruf in dem Array zu starten. Im Idealfall ohne würden wir dies tun in einer DataIx Referenz übergeben.

dies in C ++ tun, wir würden nur einen Zeiger in die Array Hand um, und jede Funktion Process wäre es erhöht je nach Bedarf.

Jede Objektklasse weiß, wie seine eigenen Nachrichten serialisiert werden und können auf (in C ++) zurückzukehren, um den Zeiger am Anfang der nächsten Nachricht im Stream verlassen.

Gibt es einen eingebauten Mechanismus, den wir dies tun können (ohne unsafe gehen)? Der Betrieb ist eine hohe Frequenz (~ 10kps) und sehr leicht. Wir wollen auch nicht gehen, Kopieren oder das Array trimmen.

Danke für Ihre Hilfe.

War es hilfreich?

Lösung

Könnten Sie einfach nicht passieren in und gibt den Array-Index? Das ist im Grunde genommen alles, was ein Zeiger wie auch immer, ein Offset von einer festen Speicherstelle.

Andere Tipps

Nun, das klingt wie Sie einen einfachen Stream wollen (zB Verwendung nur Memory als Wrapper um Ihren Byte-Array: stream = new MemoryStream (data)). wickeln Sie einfach den Byte-Array in einen Strom und jedes Objekt liest aus dem Strom, so viel wie es braucht, und dann die Hände über der Strom zum nächsten Punkt. Es hat sogar den Vorteil, dass Sie nicht gezwungen sind, auf einmal den gesamten Byte-Array zu laden.

Anders als das Sie Zeiger in C # genau so, wie du getan hast in C ++ verwenden können (obwohl Zeiger erfordern wird das Schlüsselwort unsafe und sie sind entmutigt)

Alternativ können Sie nur Daten übergeben und eine Indexvariable und dann den Index erhöht (das ist in der Tat das gleiche wie einen Zeiger verwenden, aber nicht unsicher benötigen).

Wie sei es, die Daten in einem Memory Einwickeln und dann einen Stream in die ExtractMessage Methode übergeben?

Ich denke, einige Dinge in den Sinn kommen.

Sie können die Aktion des Zeigers simulieren, indem die byte [] in einer Klasse Verpackung, die auch die Anordnung gehalten versetzt. Jedes Mal, wenn Sie das Array zugreifen würden Sie es durch die Klasse zugreifen, wahrscheinlich über eine Zugriffsmethode, die das nächste Byte zurückgegeben und erhöhte auch das Offset-Variable. Die Klasseninstanz zwischen den verschiedenen ExtractMessage Funktionsaufrufen weitergegeben werden kann.

Wie etwa C ++ / CLI verwenden? Dies würde es ermöglichen Ihnen vertraut C / C ++ Techniken zu verwenden, und doch direkt von C #, ohne die gefürchtete Interop aufrufbar sein.

Dann natürlich gibt es die gefürchtete unsichere Option, wodurch Sie einen C # Zeiger auf das Byte erhalten [] und führen Sie die erforderliche Zeigerarithmetik.

Sie könnten einen stream vom Byte-Array erstellen.

Stream stream = new MemoryStream(data);

Dann könnte Ihr Prozessor anstatt auf Streams arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top