Jak łatwo połączyć dwie byte
tablice?
Mówić,
byte a[];
byte b[];
Jak połączyć dwie byte
tablice i przechowywać je w innej byte
tablicy?
java
arrays
concatenation
androidGuy
źródło
źródło
System.arrayCopy
,ByteBuffer
a część - nie tak skuteczne, ale czytelny -ByteArrayOutputStream
wszystkie zostały pokryte. Mamy ponad 7 duplikatów podanych tutaj odpowiedzi. Nie publikuj więcej duplikatów.Odpowiedzi:
Najprostszy:
źródło
Najbardziej eleganckim sposobem na to jest użycie
ByteArrayOutputStream
.źródło
outputStream.write( c );
- nie musisz cofać się i edytować linii, w której utworzono wynikową tablicę bajtów. Również zmiana kolejności tablic jest prosta, w przeciwieństwie do metody arraycopy.a.length + b.length
argumentu dlaByteArrayOutputStream
konstruktora. Zauważ, że ta metoda nadal skopiuje wszystkie bajty do nowej tablicy, aby ją przypisaćc[]
! RozważByteBuffer
metodę bliską rywalkę, która nie marnuje pamięci.Oto rozwiązanie ładny użyciu Guava „s
com.google.common.primitives.Bytes
:Wspaniałą rzeczą w tej metodzie jest to, że ma podpis varargs:
co oznacza, że możesz połączyć dowolną liczbę tablic w jednym wywołaniu metody.
źródło
Inną możliwością jest użycie
java.nio.ByteBuffer
.Coś jak
Zauważ, że tablica musi być odpowiednio dobrana na początek, więc wymagana jest linia alokacji (ponieważ
array()
po prostu zwraca tablicę bazową, bez uwzględnienia przesunięcia, położenia lub ograniczenia).źródło
ByteBuffer.allocate(int)
jest metodą statyczną, która zwraca instancjęjava.nio.HeapByteBuffer
, podklasęByteBuffer
. Zajmuje się metodami.put()
i.compact()
- i każdą inną abstrakcyjnością.compact()
linię, ponieważ jest niepoprawna.bb.flip(); bb.get(result);
zamiastbyte[] result = bb.array();
wiersza.allocate
metody ujawnia następujące informacje: „Pozycja nowego bufora będzie wynosić zero, jego limitem będzie pojemność, jego znak będzie niezdefiniowany, a każdy jego element zostanie zainicjowany na zero . Będzie miał tablicę podkładową, a przesunięcie tablicy będzie wynosić zero. Dlatego w przypadku tego konkretnego fragmentu kodu, w którymByteBuffer
jest on przydzielany wewnętrznie, nie stanowi to problemu.Innym sposobem jest użycie funkcji narzędzia (jeśli chcesz, możesz to uczynić statyczną metodą ogólnej klasy narzędzi):
Wywołaj tak:
Będzie również działał dla łączenia 3, 4, 5 tablic itp.
Robiąc to w ten sposób, zyskujesz przewagę szybkiego kodu arraycopy, który jest również bardzo łatwy do odczytania i utrzymania.
źródło
źródło
Jeśli wolisz
ByteBuffer
@kalefranz, zawsze istnieje możliwość połączenia dwóchbyte[]
(lub nawet więcej) w jednym wierszu, tak jak to:źródło
Możesz używać bibliotek stron trzecich do czyszczenia kodu, takich jak Apache Commons Lang i używać go w następujący sposób:
źródło
ArrayUtils.addAll(a, b)
ibyte[] c = Bytes.concat(a, b)
, ale ten drugi jest szybszy.W przypadku dwóch lub wielu tablic można zastosować tę prostą i czystą metodę narzędzia:
źródło
Scal dwie tablice bajtów PDF
Jeśli scalasz dwie tablice bajtów zawierające PDF, ta logika nie będzie działać. Musimy użyć narzędzia innej firmy, takiego jak PDFbox firmy Apache:
źródło
Jeśli nie chcesz zadzierać z rozmiarami tablic, po prostu użyj magii łączenia łańcuchów:
Lub zdefiniuj gdzieś w swoim kodzie
I użyć
To oczywiście działa również z więcej niż dwoma łączeniami łańcuchowymi za pomocą
+
operatora dodawania.Oba
"l1"
iISO_8859_1
wskazują zestaw znaków Western Latin 1, który koduje każdy znak jako pojedynczy bajt. Ponieważ nie są wykonywane tłumaczenia wielobajtowe, znaki w ciągu będą miały takie same wartości jak bajty (z tym wyjątkiem, że zawsze będą interpretowane jako wartości dodatnie, ponieważ niechar
są podpisane). Przynajmniej w przypadku środowiska wykonawczego dostarczonego przez Oracle każdy bajt zostanie zatem poprawnie „zdekodowany”, a następnie „ponownie zakodowany”.Uwaga: ciągi znacznie rozszerzają tablicę bajtów, co wymaga dodatkowej pamięci. Łańcuchy mogą być również internowane i dlatego nie będą łatwe do usunięcia. Ciągi są również niezmienne, więc wartości wewnątrz nich nie można zniszczyć. Dlatego nie powinieneś łączyć wrażliwych tablic w ten sposób, ani nie powinieneś używać tej metody dla tablic o większych bajtach. Wymagane byłoby również wyraźne wskazanie tego, co robisz, ponieważ ta metoda konkatenacji macierzy nie jest powszechnym rozwiązaniem.
źródło
To jest mój sposób, aby to zrobić!
Funkcje :
...
), aby wywołać dowolną liczbę bajtów [].System.arraycopy()
które jest zaimplementowane z natywnym kodem specyficznym dla maszyny, aby zapewnić szybkie działanie.int
zmiennych, ponownie wykorzystując zmiennei
ilen
.Pamiętaj :
Lepszym sposobem na to jest skopiowanie kodu @Jonathan . Problem pochodzi z rodzimych tablic zmiennych, ponieważ Java tworzy nowe zmienne, gdy ten typ danych jest przekazywany do innej funkcji.
źródło