RTV forum PL | NewsGroups PL

Problemy z odczytem bajtów z bufora w aplikacji Android napisanej w Javie

Android

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odczytem bajtów z bufora w aplikacji Android napisanej w Javie

Goto page Previous  1, 2, 3, 4  Next

Artur M. Piwko
Guest

Wed Feb 09, 2011 9:33 am   



In the darkest hour on Wed, 09 Feb 2011 00:02:54 +0100,
J.F <jfox_xnospamx@poczta.onet.pl> screamed:
Quote:
Powiem ci, że nie mam pojęcia Smile
byte y = buf[10];
Ta linijka mi załatwia sprawę :-)

Jeszcze wrócę do sprawy jutro Smile Nie daje mi to spokoju :-)

Jest tam jakas opcja wydruku w "assemblerze" ?
Moze sie cos ujawni .


Da się zobaczyć jak kod wygląda na poziomie byte kodu.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:223B ]
[ 09:32:36 user up 12708 days, 21:27, 1 user, load average: 0.43, 0.10, 0.77 ]

I am not a perfectionist! (My parents were).

ohouapss
Guest

Wed Feb 09, 2011 7:06 pm   



On 9 Lut, 09:33, "Artur M. Piwko" <milusi.pysiac...@buziaczek.pl>
wrote:
Quote:

Da się zobaczyć jak kod wygląda na poziomie byte kodu.


Skoro ta dyskusja trwa dalej, to zanim się wytoczy takie armaty, można
byłoby poprosić autora wątku o kompilowalny kawałek kodu który ma
sprawiać takie problemy? Z opisu, z pierwszej wiadomości, można
podejrzewać że program rzuca coś w rodzaju segfaulta a nie wyjątek.
Nie wierzę w to jakoś, jeśli nie ma tam żadnego odwołania do JNI.

Lelek@
Guest

Wed Feb 09, 2011 7:59 pm   



"ohouapss" <knapikgm@gmail.com> wrote in message
news:19b7d58f-44f6-4c22-9a6e-f1534231e21d@v31g2000vbs.googlegroups.com...
On 9 Lut, 09:33, "Artur M. Piwko" <milusi.pysiac...@buziaczek.pl>
wrote:
Quote:

Da się zobaczyć jak kod wygląda na poziomie byte kodu.


Skoro ta dyskusja trwa dalej, to zanim się wytoczy takie armaty, można
byłoby poprosić autora wątku o kompilowalny kawałek kodu który ma
sprawiać takie problemy? Z opisu, z pierwszej wiadomości, można

public void dupa() {
byte buf[] = new byte[256];
int bfx[] = new int[256];
int i, len;

buf = FromEditText.getBytes("UTF-8");

len = buf.length;

for (i = 0; i < len; i++) {bfx[i] = ((int)buf[i] & 0xFF);}

// tu dalej kod ale niezwiązany

}

Jeżeli w polu EditText nic nie wpiszę, będzie puste to próba odczytania
buf[0] skończy się wywałką.
Pętle for można wywalić do testów nie chodzi o jej warunek < len. Pętlę
dodałem później

Zabezpieczyłem to tak:

if (len != 0) {
for (i = 0; i < len; i++) {bfx[i] = ((int)buf[i] & 0xFF);}
}

Lelek@
Guest

Wed Feb 09, 2011 8:03 pm   



to mi wyglada na jakąś cholerną optymalizację garbage collecrion czy coś
takiego w czasie wykonywania, że nie jeżeli buf = zamiana zawartośco pola
wide charów UTF16 na UTF8 na bajty daje tylko null to tablica nie powstaje

Lelek@
Guest

Wed Feb 09, 2011 8:14 pm   



ale jak wpiszę choćby jeden znak konwertujący się na 1 bajt w utf8 to mogę
czytać dowolny element tablicy bez wywałki.

Chodzi o to, że jeśli to:
buf = FromEditText.getBytes("UTF-8");
nie będzie miało czego czytać w polu bo nic w nie nie wpiszę

to byte Y = buf[0} czy int Y = (int)buf[0]

zamyka program "przysłowiowy ble screen" i do widzenia
zamyka aplikację

Michoo
Guest

Wed Feb 09, 2011 8:46 pm   



W dniu 09.02.2011 19:59, Lelek@ pisze:
Quote:
Jeżeli w polu EditText nic nie wpiszę, będzie puste to próba odczytania
buf[0] skończy się wywałką.
Chyba trochę namieszałeś:
byte buf[] = new byte[256];
Tworzysz nową tablicę typu byte. Powinna być czytelna w odróżnieniu od

tablicy Byte w której trzeba dodatkowo utworzyć każdy element.

Quote:
int bfx[] = new int[256];
int i, len;

buf = FromEditText.getBytes("UTF-8");
Tutaj stary buf zostaje oddany do dyspozycji gc a przypisywany jest

nowy. Strzelam, że jak EditText jest pusty to zwraca null a nie pustego
stringa i stąd problem.

--
Pozdrawiam
Michoo

ohouapss
Guest

Wed Feb 09, 2011 9:19 pm   



On 9 Lut, 20:03, "Lelek@" <n...@nndn.pl> wrote:
Quote:
to mi wyglada na jak cholern optymalizacj garbage collecrion czy co
takiego w czasie wykonywania, e nie je eli buf = zamiana zawarto co pola
wide char w UTF16 na UTF8 na bajty daje tylko null to tablica nie powstaje

To zabezpieczenie nie ma sensu, gdy len == 0 pętla się po prostu nie
wykona. A jaki wyjątek rzuca?

Lelek@
Guest

Wed Feb 09, 2011 9:29 pm   



"ohouapss" <knapikgm@gmail.com> wrote in message
news:5fa375b4-b868-4c45-82d9-ab166c0c6676@s28g2000prb.googlegroups.com...
On 9 Lut, 20:14, "Lelek@" <n...@nndn.pl> wrote:
Quote:
nie będzie miało czego czytać w polu bo nic w nie nie wpiszę

to byte Y = buf[0} czy int Y = (int)buf[0]

zamyka program "przysłowiowy ble screen" i do widzenia
zamyka aplikację

//A może problem wynika z tego, że jak nic nie wpiszesz to dostajesz
//null, na rzecz którego próbujesz wywołać jakieś metody? Już buf.length
//może być problematyczne. Wtedy potrzebny byłby test na null i tyle.

wywalenie buf.length z kodu zakomentowanie go nic nie daje

Lelek@
Guest

Wed Feb 09, 2011 9:33 pm   



"ohouapss" <knapikgm@gmail.com> wrote in message
news:7e95f46b-b448-41f1-873e-676287a3a836@t8g2000vbd.googlegroups.com...

// To zabezpieczenie nie ma sensu, gdy len == 0 pętla się po prostu nie
// wykona. A jaki wyjątek rzuca?

Nie wiem jak to sprawdzić, bo dopiero od tygodnia to robię Smile Nie wiem
gdzie tam sa debugery, ktore coś pokazują Smile
Podpowiedz mi :-)

Co do petli for(;;Wink to może jej nie być. Chodzi o to, że jak długość jest 0
len=0 to nie wolno mi czytać buf[] bo aplikacja się zamyka bez powodu Smile
Jestem zdumiony tym zachowaniem.
W ogóle jestem zdumiony, że nie ma UNSIGNED w całej tej javie i wszystko co
sie chce robić trzeba robić na wiekszych, szczególnie boli uINT że trzeba go
obrabiać w LONG i stale maskować & 0xFFFFFFFFL

Lelek@
Guest

Wed Feb 09, 2011 9:35 pm   



"Michoo" <michoo_news@vp.pl> wrote in message
news:iiuqum$k3b$1@news.onet.pl...

Quote:
int bfx[] = new int[256];
int i, len;

buf = FromEditText.getBytes("UTF-8");
Tutaj stary buf zostaje oddany do dyspozycji gc a przypisywany jest nowy.
Strzelam, że jak EditText jest pusty to zwraca null a nie pustego stringa
i stąd problem.

Ja to wiem i ty to wiesz ale czemu oddaje pamięć przed końcem funkcji? tfu
metody i to jeszcze "likely" Smile

Lelek@
Guest

Wed Feb 09, 2011 9:43 pm   



"Michoo" <michoo_news@vp.pl> wrote in message
news:iiuqum$k3b$1@news.onet.pl...
Quote:
W dniu 09.02.2011 19:59, Lelek@ pisze:
Jeżeli w polu EditText nic nie wpiszę, będzie puste to próba odczytania
buf[0] skończy się wywałką.
Chyba trochę namieszałeś:
byte buf[] = new byte[256];

Ktoś na pl.comp.programming zapodał żeby zadeklarować ten buf[] jako final
hmmm. Czyżby w javie można tym zakazać wtrącać się w tę tablicę ? To i ma w
pewnym stopniu sens. Zaraz sprawdzę Smile

ohouapss
Guest

Wed Feb 09, 2011 9:44 pm   



On 9 Lut, 20:14, "Lelek@" <n...@nndn.pl> wrote:
Quote:
nie będzie miało czego czytać w polu bo nic w nie nie wpiszę

to byte Y = buf[0} czy int Y = (int)buf[0]

zamyka program "przysłowiowy ble screen" i do widzenia
zamyka aplikację

A może problem wynika z tego, że jak nic nie wpiszesz to dostajesz
null, na rzecz którego próbujesz wywołać jakieś metody? Już buf..length
może być problematyczne. Wtedy potrzebny byłby test na null i tyle.

J.F.
Guest

Wed Feb 09, 2011 10:17 pm   



On Wed, 9 Feb 2011 21:35:20 +0100, Lelek@ wrote:
Quote:
"Michoo" <michoo_news@vp.pl> wrote in message
buf = FromEditText.getBytes("UTF-8");
Tutaj stary buf zostaje oddany do dyspozycji gc a przypisywany jest nowy.
Strzelam, że jak EditText jest pusty to zwraca null a nie pustego stringa
i stąd problem.

Ja to wiem i ty to wiesz ale czemu oddaje pamięć przed końcem funkcji? tfu
metody i to jeszcze "likely" Smile

Przed koncem ? Raczej powinna przed poczatkiem - jak rozumiem to
getBytes alokuje nowy bufor na odpowiedz.

Przy odrobinie optymalizacji moze nawet nie alokuje wtedy gdy wyraznie
piszesz new ..

J.

Lelek@
Guest

Wed Feb 09, 2011 10:44 pm   



"J.F." <jfox_xnospamx@poczta.onet.pl> wrote in message
news:bt06l6tprh86lbo6opbgkgll9qggti3cod@4ax.com...

Quote:
Przy odrobinie optymalizacji moze nawet nie alokuje wtedy gdy wyraznie
piszesz new ..

Ale to jest taka składnia javy. Inaczej się nie da zapisać alokacji bufora
... chyba, że go zadeklaruję

byte buf[] = {0,0,0,0,0,0,0,0,0,0...............} Tak 256 razy. Nie wiem co
to zmieni, bo samego byte buf[256] sie nie da w javie.
Nie rozumiem różnicy.

Adam Dybkowski
Guest

Wed Feb 09, 2011 11:15 pm   



W dniu 2011-02-09 19:59 Lelek@ napisał(a):

Quote:
Skoro ta dyskusja trwa dalej, to zanim się wytoczy takie armaty, można
byłoby poprosić autora wątku o kompilowalny kawałek kodu który ma
sprawiać takie problemy? Z opisu, z pierwszej wiadomości, można

public void dupa() {
[...]
Jeżeli w polu EditText nic nie wpiszę, będzie puste to próba odczytania
buf[0] skończy się wywałką.

Hmmm, coś chyba ściemniasz. Skopiowałem twój przykładowy kod i odpaliłem
w emulatorze 2.2. Na głównej aktywności mam kontrolkę edycyjną o nazwie
"editText1". Tak wygląda cała metoda (podpiąłem jej wywołanie pod
naciśnięcie dodatkowego przycisku):

public void test() {
EditText editText = (EditText) findViewById(R.id.editText1);
String fromEditText = editText.getText().toString();

byte buf[] = new byte[256];
int bfx[] = new int[256];
int i, len;

try {
buf = fromEditText.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}

len = buf.length;

for (i = 0; i < len; i++) {
bfx[i] = ((int)buf[i] & 0xFF);
Log.d("TEST", "BYTE: " + bfx[i]);
}
}

Znajduje się tu wszystko, co przytoczyłeś plus dodatkowy kod na początku
do odczytania ciągu znaków z kontrolki edycyjnej. Początkowe
zaalokowanie bufora buf nie ma znaczenia bo metoda getBytes() i tak
zwraca tablicę bajtów i zmienna buf zostanie nadpisana. Prościej jest
nie deklarować tej zmiennej na początku tylko dopiero gdy jest
potrzebna, np:
byte buf[] = fromEditText.getBytes("UTF-8");

W każdym razie uruchomienie daje spodziewane rezultaty. Gdy kontrolka
jest pusta to nic się nie wywala, metoda getBytes() zwraca pustą tablicę
a nie null, w zmiennej len mamy wartość 0 i nic się nie wypisuje.

Natomiast gdy do kontrolki edycyjnej wpiszę jakiś tekst to także
powyższy kod działa zgodnie z oczekiwaniami. Na debugu (to ten magiczny
LogCat, w Eclipse możesz go pokazać wybierając z menu: Window/Show
view/Other/Android/LogCat albo prościej naciskając Ctrl+3 i wpisując
"logcat") jest to pokazywane:

02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 97
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 100
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 97
02-09 22:04:03.585: DEBUG/TEST(336): BYTE: 109

Chyba nie unikniesz pokazania większego kawałka kodu aby ustalić co się
wywala właściwie. Możesz spakować cały projekt i wrzucić gdzieś na sieć?

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Goto page Previous  1, 2, 3, 4  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Problemy z odczytem bajtów z bufora w aplikacji Android napisanej w Javie

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map