Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C# byte[]

Witam, mam tablice byte[] od dość dużej długości i chciałbym coś wstawić na jej początek czyli pod index 0 ale tak żeby aktualnego początku nie stracić tylko przesunąć całą zawartość tablicy o index +1;

Jak można było by to zrobić?

Pozdrawiam
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: C# byte[]

Jeśli możesz użyj List<byte> i funkcji Insert(index, byte)



var bytes = new List<byte>();
bytes.Insert(0, 255);



W razie czego możesz taką listę skonwertować do byte[]
bytes.ToArray();

Jeśli jednak musisz używać byte[] to pozostaje tobie tylko kopiowanie elementów.

Rozwiązanie:
http://stackoverflow.com/a/5591364/1180808Marcin Sulecki edytował(a) ten post dnia 03.10.12 o godzinie 10:31

Temat: C# byte[]

Pytasz poważnie?

Opis słowno-muzyczny:
Zaalokuj nową tablicę (arraye są "immutable", nawet metoda Resize i tak zadeklaruje nową strukturę) o rozmiarze N+1. W pętli kopiuj od końca elementy o jedną komórkę wprzód. Przedostatni (w oryginalnej był to element ostatni) do obecnej ostatniej komórki czyli n-1 -> n, n-2 -> n-1,... n-k, n-k+1....., aż uzyskasz miejsce w pierwszej komórce (bo ta wartość znajduje się teraz także w 2 komórce). Do pierwszej komórki wstawiasz to, co chciałeś.

W sytuacjach, gdy spodziewasz się wstawiania elementów w środek kolekcji używaj list.
Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C# byte[]

Tak pytam poważnie, wiem ze można utworzyć wiekszą tablice i przepisywać (kopiować) elementy ale myślałem że da sie to zrobić szybciej.

Może opisze do czego mi jest to potrzebne.

Mam dwie aplikacje które sie ze sobą komunikują i jedna wysyła do drugiej zdjęcia, używam do wysyłania:

NetworkStream .Write(byteSend, 0, byteSend.Length);


ale chciałem właśnie na początek tej tablicy wstawić znak '<' tak żeby aplikacja która bedzie czytała wiedziała od kiedy może zacząć czytać. Dodatkowo jeszcze przed wysłaniem zdjęcia wysyła długość byteSend.Length żeby ta aplikacja wiedziała jak długo ma czytać.

Dodatkowo ta aplikacja wysyłająca bedzie na terminalu z WM i dla zaoszczędzenia pamięci nie chcialem tworzyć dodatkowej tablicy.Dariusz Bujak edytował(a) ten post dnia 03.10.12 o godzinie 10:58

Temat: C# byte[]

No właśnie od zarania dziejów tablice są niemodyfikowalne pod względem rozmiaru, statyczne. Nie da się tego obejść, no bo jak. Dlatego właśnie wymyślono listy. Dostęp do dowolnego elementu listy jest wolniejszy, wymagane jest pamiętanie dodatkowych informacji (następnik i ew. poprzednik), ale za to operacje na elementach są łatwe i oszczędne. Dostęp do dowolnego elementu tablicy jest szybki, ale operacja wstawiania wymaga zaalokowania nowej struktury.

A nie możesz najpierw wysłać znaku startu, a potem danych?Adrian Olszewski edytował(a) ten post dnia 03.10.12 o godzinie 10:53
Dariusz Bujak

Dariusz Bujak Student, młodszy
programista JAVA,
C++

Temat: C# byte[]

Ok,

dzieki bede musiał pomyśleć jeszcze nad tym sposobem.

Dzieki za pomoc, pozdrawiam.
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: C# byte[]

Adrian Olszewski:
No właśnie od zarania dziejów tablice są niemodyfikowalne pod względem rozmiaru, statyczne. Nie da się tego obejść, no bo jak.
Azaliż powiadasz...
http://msdn.microsoft.com/en-us/library/w8k3cys2.aspx

pozdrawiaMMMarcin Miga edytował(a) ten post dnia 03.10.12 o godzinie 20:32

konto usunięte

Temat: C# byte[]


var prefix = new byte[1] {(byte)'<'};
NetworkStream .Write(prefix, 0, 1);
NetworkStream .Write(byteSend, 0, byteSend.Length);

Temat: C# byte[]

Marcin Miga:
Adrian Olszewski:
No właśnie od zarania dziejów tablice są niemodyfikowalne pod względem rozmiaru, statyczne. Nie da się tego obejść, no bo jak.
Azaliż powiadasz...
http://msdn.microsoft.com/en-us/library/w8k3cys2.aspx

pozdrawiaMM

Nie rozumiem, co masz na myśli. Jeśli to, że istnieje jednak metoda, to niestety, ale nie. To by oznaczało, że tablica jest jednak bardziej złożoną strukturą "o nazwie array" i ukrywa pewne operacje przed użytkownikiem. Jeśli coś innego, to wyjaśnij proszę.

If you need to change the size of an array, you must use the ReDim Statement (Visual Basic). When you do this, Visual Basic creates a new array and releases the previous array for disposal. This takes execution time.
http://msdn.microsoft.com/en-us/library/wak0wfyt.aspx

Dla mnie tablica to ciąg komórek pamięci, jak w assemblerze albo C. Nic ponad to.

@Piotr - o właśnie, o to mi chodziło z pierwotnym przesłaniem znaku startu a potem bufora danych bez żadnych modyfikacji.Adrian Olszewski edytował(a) ten post dnia 03.10.12 o godzinie 21:41
Karim Agha

Karim Agha Software Engineer

Temat: C# byte[]

Jesli NetworkStream.Read podasz jako drugi argument "1" to dane zaczna sie zapisywac od arr[1], wtedy index zerowy zostaje niezmieniony i mozesz wstawic swoj marker wlasnie tam, bez modyfikacji tablicy.

Jak mozesz uzyc unsafe code/albo unmanaged to masz jeszcze prosciej - bierzesz wskaznik na ktorys element tablicy i przekonujesz kompilator ze to jest wskaznik na pierwszy element jakiejs innej tablicy i wtedy dane sie zapisuja pod adresem tamtego elementu ktory jest tak na prawde ntym elementem w tablicy wyjsciowej.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: C# byte[]

Możesz to zrobić nietypowo.
Zamień byte na string, dodaj literkę na początek, przekonwertuj z powrotem na byte[]


public static class ArrayExtensionMethods
{
public static byte[] ExpandArrayUsingString(this byte[] array)
{
string str = System.Text.Encoding.UTF8.GetString(array, 0, array.Length);
str = "A" + str;
byte[] newArray = Encoding.UTF8.GetBytes(str);
return newArray;

}
}


:P

Temat: C# byte[]

Stringi są "immutable". Sam proces będzie łatwiejszy, ale sprowadzi się do utworzenia nowej tablicy, ustawienia w tej nowej żądanego zerowego elementu i przekopiowanie pozostałych ze starej do nowej. A raczej dojdzie jeszcze trzecia struktura: string1, string2, byte[].Adrian Olszewski edytował(a) ten post dnia 10.10.12 o godzinie 12:40
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: C# byte[]

No tak, ale Dariusz napisał, że ma to być szybkie w implementacji -
chyba. Nie wszystko, co się szybko pisze jest efektywne :P

edit:
Poza tym efektywność w tym przykładzie miała chyba znaczenie marginalne dla projektu.Borysław Bobulski edytował(a) ten post dnia 10.10.12 o godzinie 12:47
Karim Agha

Karim Agha Software Engineer

Temat: C# byte[]

Borysław Bobulski:
No tak, ale Dariusz napisał, że ma to być szybkie w implementacji -
chyba. Nie wszystko, co się szybko pisze jest efektywne :P

edit:
Poza tym efektywność w tym przykładzie miała chyba znaczenie marginalne dla projektu.

Szybkosc implementacji i efektywnosc kodu przewaznie nie wykluczaja sie.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: C# byte[]

To chyba zależy z jakich bibliotek korzystasz implementując algorytm. Jeśli jesteś gdzieś "wysoko" to masz tylko kilka funkcji, ale niekoniecznie będą one optymalne dla Twoich potrzeb.

edit:
Podane rozwiązanie to była tylko ciekawostka.Borysław Bobulski edytował(a) ten post dnia 10.10.12 o godzinie 13:27

Następna dyskusja:

Walidator XHTML i Byte Orde...




Wyślij zaproszenie do