C#: 128-256tes Element eines Arrays uebergeben
-
Hallo,
ich habe eine Funktion die 128 byte verarbeiten kann, diese ist leider nicht änderbar:
public void SendData(byte[] data) { //hier alle 128 Bytes bearbeiten // ist etwas kompliziert }
Aufgerufen wird sie normalerweise so:
byte[] data = new byte[128]; for (int i = 0; i < 128; i++) { data[i] = (byte)i; } SendData(data);
Aber was tun wenn mein originaler Buffer doppelt so groß ist? In C hätte man dann einen Zeiger auf das erste und danach auf das 128. Element uebergeben, man könnte das mit "unsafe" nun auch machen ist aber halt auch unsauber.
Beispiel(funktioniert nicht, nur zur Klarstellung):
byte[] data = new byte[256]; for (int i = 0; i < 256; i++) { data[i] = (byte)i; } SendData(data[0]); SendData(data[128]);
Das funktioniert nicht. Muss ich das Array-Object vorher händisch splitten? Gibt es eine Möglichkeit das zu tun ohne den Speicherplatz doppelt zu belegen?
Vielen Danke
Joe
-
Hallo,
dann wirst du jeweils die 128-Byte-Puffer per Kopieren erstellen müssen:
byte[] data = new byte[256]; byte[] buffer = new byte[128]; int n = 0; Array.Copy-Methode(data, n, buffer, 0, 128); SendData(buffer); n += 128; Array.Copy-Methode(data, n, buffer, 0, 128); SendData(buffer);
(kannst natürlich auch eine Schleife benutzen
Anders wird es nicht gehen, da die SendData-Methode wohl (so wie du schreibst) intern direkt die Indizes 0 - 127 benutzt (besser wäre natürlich data.Length).
-
Wie wäre es mit Linq und Skip
Also sowas hier:byte[] data = new byte[256]; SendData(data.Skip(127).ToArray());
-
Ich bin zwar LINQ-Fan, aber in dem Fall würd ich eher 'ne kleine Hilfsmethode erstellen, anstatt die großen Geschütze aufzufahren und doppelt zu kopieren
-
Nagut
-
Ideal wäre natürlich wenn du die SendData() Methode selbst gebaut hast und dort z.B. nen offset-Parameter ergänzen könntest.
-
Jopp.
Offset + Länge als zusätzliche Parameter.So wie es quasi alle Funktionen im .NET Framework machen, die mit Arrays arbeiten.
Wobei... weiss jmd. von euch ob das nur eine Limitierung der Sprache ist, oder eine von .NET im Allgemeinen? (Also dass man keine "Views" in ein Array erstellen kann)
-
hustbaer schrieb:
Wobei... weiss jmd. von euch ob das nur eine Limitierung der Sprache ist, oder eine von .NET im Allgemeinen? (Also dass man keine "Views" in ein Array erstellen kann)
Wüsste nicht dass .NET das kann, außer über die unsafe-Pointer halt.
Aber.. Eric Lippert to teh rescue! http://blogs.msdn.com/b/ericlippert/archive/2011/03/10/references-and-pointers-part-two.aspx
Der hat da mal eine lustige ArrayPointer-Klasse gebastelt und den Pointer-Gedanken umgesetzt
-
Hallo zusammen,
danke! ich werde also kopieren (oder die SendData anpassen lassen).
Danke euch!!