Laden...

Custom Marshalling - IntPtr->byte[]

Erstellt von onkel_keks vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.394 Views
O
onkel_keks Themenstarter:in
20 Beiträge seit 2013
vor 10 Jahren
Custom Marshalling - IntPtr->byte[]

Hallo,

ich bekomme über eine COM-Funktion einen Pointer auf ein Byte-Array, also in C++-Syntax, ein BYTE**. In der C#-Repräsentation (also über die Wrapper-Lib) bekomme ich diesen Pointer als IntPtr. Ich möchte dieses in ein C#-byte[] umwandeln, würde also so etwas machen:


int hr;
IntPtr buffer_ptr;
byte[] my_array = new byte[array_size];

hr = vmr_control.GetCurrentImage(out buffer_ptr);  // COM call returning buffer_ptr
// hr check...nicht wichtig - übersprungen

Marshal.Copy(buffer_ptr, my_array, 0, array_size);

Jetzt enthält dieses Byte-Array (wie das Snippet schon verrät) Bilddaten, die ich umordnen muss - nämlich das ganze Bild auf den Kopf stellen und Grün- und Blaukanäle tauschen. Um das zu erreichen, müsste ich mir nun _noch _eine Kopie des Arrays anlegen und beim Kopieren eben entsprechend verfahren. Darunter leidet natürlich die Performance, und da es dabei um das Abspielen eines Videos geht wäre das sehr schlecht.

Meine Frage: Kann ich Marhshal.Copy irgendwie "customizen", sodass ich bestimmen kann, _wie _die Daten in das byte[] kopiert werden?

W
872 Beiträge seit 2005
vor 10 Jahren

Schau Dir mal den Artikel Gewusst wie: Verwenden von Zeigern zum Kopieren eines Bytearrays (C#-Programmierhandbuch) über direkte Pointerarithmetik als unsafe code an - ich denke, dass Du entweder eine C++/CLI oder darueber vorgehen musst, um entsprechend schnellen Code zu schreiben.
Edit - zum Umdrehen wirst Du wahrscheinlich mit Array.Reverse arbeiten koennen - das sollte auch sehr schnell sein.

I
57 Beiträge seit 2011
vor 10 Jahren

MemCpy in C#

Ist unter x64 deutlich effizienter.
Unter x84 solltest du auf die üblichen Mittel zurückgreifen.

W
872 Beiträge seit 2005
vor 10 Jahren

Sehr cool - werde ich mal austesten, inwiefern das schneller als Buffer.BlockCopy ist.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo onkel_keks,

Kann ich Marhshal.Copy irgendwie "customizen", sodass ich bestimmen kann, wie die Daten in das byte[] kopiert werden?

nein, gerade beim Vertauschen von zwei Farbkanälen kann man die Daten gerade nicht mehr blockweise kopieren. Das erfordert m.E. immer das Ausprogrammieren der einzelnen Kopieroperationen.

herbivore