dzielenie i łączenie bajtów

47 views
Skip to first unread message

Vexator

unread,
Sep 16, 2008, 5:01:16 AM9/16/08
to Trójmiasto JUG
witajcie.

mam kolejne pytanko :D

mam tablicę bajtów
bajt[0]=01001101; //*
bajt[1]=01100001;
bajt[2]=01101110;

//* - oczywiście wprowadzone inaczej, tu przedstawiam tylko wartości

chciałbym, żeby wszystkie te bajty zostały połączone w jeden ciąg
bitów a następnie podzielony na nowe bajty, tylko nie po 8, lecz po 6
bitów

chodzi mi o coś takiego:
01001101, 01100001, 01101110 -> 010011010110000101101110 -> 010011,
010110, 000101, 101110

w jaki sposób mogę to uczynić?

Cyprian Śniegota

unread,
Sep 16, 2008, 6:48:09 AM9/16/08
to jug-tro...@googlegroups.com
Możesz napisać dokładniej, jak przetrzymujesz bity w tablicy bajt?
zapis 01001101 to liczba ósemkowa w javie. Napisz jakiego typu masz tę tablicę. Jeżeli jest to liczba, to ładniej wygląda:
bajt[0] = 77; // 1001101
"najprościej" to będzie chyba zrobić przesunięcia w stylu tmp = bajt[0] + (bajt[1] * 256) + (bajt[2] * 256 * 256)
a potem newBajt[0] = tmp % 64;
newBajt[1] = (tmp/64)%64;
... itd
--
pozdrawiam
Cyprian Śniegota

Vexator

unread,
Sep 16, 2008, 7:28:40 AM9/16/08
to Trójmiasto JUG
String literki = "Man";
byte[] bajt = literki.getBytes()

On 16 Wrz, 12:48, "Cyprian Śniegota" <cypria...@gmail.com> wrote:
> Możesz napisać dokładniej, jak przetrzymujesz bity w tablicy bajt?
> zapis 01001101 to liczba ósemkowa w javie. Napisz jakiego typu masz tę
> tablicę. Jeżeli jest to liczba, to ładniej wygląda:
> bajt[0] = 77; // 1001101
> "najprościej" to będzie chyba zrobić przesunięcia w stylu tmp = bajt[0] +
> (bajt[1] * 256) + (bajt[2] * 256 * 256)
> a potem newBajt[0] = tmp % 64;
> newBajt[1] = (tmp/64)%64;
> ... itd
>
Message has been deleted

Vexator

unread,
Sep 16, 2008, 8:28:19 AM9/16/08
to Trójmiasto JUG
ok. łączenie stringów z głowy.

teraz pozostało mi jeszcze łączenie tabel :D

mam dwie tabele, nie wiem ile mają komórek i chciałbym zrobić coś
takiego:

tabela1 = {1, 2, ..., n};
tabela2 = {a, b, ..., z};

tabelaRazem = {a, b, c, ..., x, y, z, 1, 2, 3, ..., n};

tak, by wspólna tabela miała wpisane najpierw wartości z tabeli2 a
później z tabeli1, niezależnie, ile tabele będą miały wpisów. czyli
tabelaRazem.length=tabela1.length+tabela2.length

Mikolaj Kmita

unread,
Sep 16, 2008, 8:43:46 AM9/16/08
to jug-tro...@googlegroups.com
Właśnie chciałem zaproponować, stringi, a nie zmienną liczbową - bo
tej szybko skończyłby się zakres...

Co prawda już to zrobiłeś, wiec może ku potomności ;)

----
public class Bits {

public static void main(String[] args) {
byte[] bytes = new Bits().run("Man");
for (byte b : bytes) {
System.out.println(toBinaryStr(b));
}
}

byte[] run(String inStr) {
byte inBytes[] = inStr.getBytes();
int newArrSize = (int) Math.ceil(4.0 / 3 * inStr.length());
byte outBytes[] = new byte[newArrSize];
StringBuilder allBytesStr = new StringBuilder();

for (byte b : inBytes) {
allBytesStr.append(toBinaryStr(b));
}

int i = 0;
while (allBytesStr.length() > 0) {
int leftChars = Math.min(allBytesStr.length(), 6);
outBytes[i] = Byte
.parseByte(allBytesStr.substring(0, leftChars), 2);
allBytesStr.delete(0, leftChars);
i++;
}

return outBytes;
}

static String toBinaryStr(byte b) {
StringBuilder outStr = new StringBuilder(Integer.toBinaryString(b));
while (outStr.length() < 8) {
outStr.insert(0, "0");
}

return outStr.toString();
}
}
----

Jak masz coś znacząco innego (czytaj zgrabniejszego;)), to wrzuć,
chętnie spojrzę :)


Pzdr.,
M.

2008/9/16 Vexator <santa...@gmail.com>:

Cyprian Śniegota

unread,
Sep 16, 2008, 10:52:19 AM9/16/08
to jug-tro...@googlegroups.com
dla trzech bajtów int powinien wystarczyć

W dniu 16 września 2008 13:51 użytkownik Vexator <santa...@gmail.com> napisał:

p.s. jakiego typu ma być zmienna tmp?


On 16 Wrz, 12:48, "Cyprian Śniegota" <cypria...@gmail.com> wrote:
tmp = bajt[0] + (bajt[1] * 256) + (bajt[2] * 256 * 256)




--
pozdrawiam
Cyprian Śniegota

Cyprian Śniegota

unread,
Sep 16, 2008, 10:55:53 AM9/16/08
to jug-tro...@googlegroups.com

Oczywiście dla większych tekstów podane przez Mikołaja rozwiązanie jest lepsze ;)


W dniu 16 września 2008 14:43 użytkownik Mikolaj Kmita <mikola...@gmail.com> napisał:
Właśnie chciałem zaproponować, stringi, a nie zmienną liczbową - bo
tej szybko skończyłby się  zakres...

Co prawda już to zrobiłeś, wiec może ku potomności ;)



--
pozdrawiam
Cyprian Śniegota

Vexator

unread,
Sep 17, 2008, 2:55:05 AM9/17/08
to Trójmiasto JUG
a co z łączeniem tabel?

Cyprian Śniegota

unread,
Sep 17, 2008, 4:04:36 AM9/17/08
to jug-tro...@googlegroups.com
Masz pętlę for, System.arraycopy. Z łączeniem tablic powinieneś sobie poradzić ;)

W dniu 17 września 2008 08:55 użytkownik Vexator <santa...@gmail.com> napisał:

a co z łączeniem tabel?


--
pozdrawiam
Cyprian Śniegota

Jakub Neumann

unread,
Sep 17, 2008, 4:13:29 AM9/17/08
to jug-tro...@googlegroups.com
Vexator pisze:

> a co z łączeniem tabel?

Będzie się za tobą ciągnął problem deklaracji rozmiaru tablic jeśli ich
rozmiar (lub ograniczenie) nie wynika z logiki programu. Ja bym poważnie
rozważył wykorzystanie w twoim projekcie zamiast tabel interfejsu List w
implementacji ArrayList (jeśli jest sporo operacji indeksowania). Wiele
operacji takich jak np. powyższa obsługiwane są natywnie.


Pozdro
Kuba

Reply all
Reply to author
Forward
0 new messages