[ tiranin @ 02.02.2005. 18:55 ] @
Imam C kod za izracunavanje neke kontrolne cifre

Code:
unsigned short Funkcija(unsigned char *tekst,int len)
{
 unsigned char w, a, i;
     w=0;
    a=0;

    for (i=0; i<len; i++){
        a+=tekst[i];      
        w^=a;          
    }
    return( (unsigned short) (w*256 + a) );
}



kako da ga napravim u Javi, jer mi nikako ne ide da samo stavim byte umesto unsigned char. Najgore je sto radi u 90% slucajeva, ali mi ponekad omane, jer se valjda potrefe negativni brojevi koji zeznu racunicu.
[ free_hr @ 02.02.2005. 20:09 ] @
Citat:
tiranin: Imam C kod za izracunavanje neke kontrolne cifre

Code:
unsigned short Funkcija(unsigned char *tekst,int len)
{
 unsigned char w, a, i;
     w=0;
    a=0;

    for (i=0; i<len; i++){
        a+=tekst[i];      
        w^=a;          
    }
    return( (unsigned short) (w*256 + a) );
}


text kao byte[], ne treba len imaš "naziv polja".length()
w,a, u long, i u int (zbog optimizacije a i nemože polje veće od maxInt) zatim
Code:

 a+=(long)(text[i]);
a=a&0x0ffff;
w^a;
w=w&0x0ffff;

return new long[]{w,a};

mislim da je bolje ovako jer vidim da vračaš kombinaciju w i a a to možeš i izvana, makar možeš i
return (((w*256)&0x0ffff+a)&0xffff)

(nadam se da nije komplicirano - a da me vidiš tek sa pokazivačima u c-u, u svakom programu bar nekoliko pokazivača na pokazivač na pokazivač ;-)
[ tiranin @ 03.02.2005. 07:54 ] @
Nismo se razumeli. Meni nije potreban kod koji lici na ovaj u C, vec koji radi 100% identicno, jer ovo sto dobijem u mom Java kodu moram da uparim sa rezultatima koji su dobijeni nekom drugom aplikacijom koja je radjena u C, a ovu metodu sam skinuo iz zvanicne dokumentacije . Naime ja sam napravio :

Code:
private short izracunaj(byte[] msg){
        byte checkSum = 0;
        byte checkXOR = 0;
        for(int i = 0; i < msg.length; i++) {
            checkSum += msg[i];
            checkXOR ^= checkSum;
        }
        return (short)(checkXOR +checkSum*256);
}


i moram da kao rezultat dobijem short (dva bajta), a u celoj kalkulaciji da se ponasa identicno kada dodje do overflowa u racunanju, da odsece gornji bit i tako dalje.
Posto je u javi byte od -128 do 127, a u C unsigned char od 0 - 255, imam utisak da upravo te stvari mi nesto remete.
Moj kod ostvaruje identicne rezultate ne u 90% kako sam prvi put napisao, vec u 99.99%, ali mi ponekad signalizira da nije u redu, a posto se sve odvija asinhrono i da ne kazem random, ne mogu ni da uhvatim taj niz bajtova koji mi generisu gresku(Javlja se jednom u desetak dana, a program radi prosecno 5-6 sati dnevno, sa oko 100 provera na sat).
Kada gledam kod, i pjehe analiziram sta se desava, cini mi se da sve ipak mora biti OK, ali negde, neka suluda kombinacija mi pravi problem.
[ tiranin @ 03.02.2005. 14:28 ] @
Nasao sam gresku. Naravno moja, ali ne u telu metode vec u pretvaranju dva bajta u short i nazad.
Nakon vracanja rezultata kao short, ja to dalje u jednom trenutku koristim sa
Code:

prviBajt = (byte)shortOdgovor;// ocekujuci da ga casting dobro odsece !?
drugiBajt = (byte)(shortOdgovor/256);

i to nazalost veoma, veoma cesto radi dobro.
medjutim, kada npr. za kombinaciju
Code:

byte a = -34;
byte b = 31;
       // napravim 
return (short)( a + b * 256);


pa posle to pokusam da vratim kroz gornji kod ne dobijem iste vrednosti.

Ocigledno da je programerska glupost beskonacna, a moj udeo u tome nije zanemarljiv :)

Hvala free_hr jer mi je dao ideju da probam sa

return new byte[]{b,a};

sto me je spaslo muka.
[ free_hr @ 03.02.2005. 19:50 ] @
kada vraćaš kompozitne rezultate (dva i više) radije koristi polje nego neku ludu kombinaciju jer ti je polje najjednostavnije a možeš i vratiti više različitih tipova podataka, npr. napraviš Object[][] a u njega trpaš druga polja bilo kojeg tipa, jedino pazi da kad vadiš, da napraviš pravilan cast.