08. juni 2004 - 10:19Der er
11 kommentarer og 1 løsning
readDouble() implementation til MIDP
Hej!
Jeg har en MIDP (J2ME) klient, der forbinder til en server vha. sockets. Dette virker også helt fint. Men serveren benytter DataOutputStream.writeDouble() til nogle af de meddelelser der sendes ud til klienten. Dvs. at jeg i klienten skulle have benyttet DataInputStream.readDouble() for at få den tal-værdi serveren sender. Men da MIDP ikke understøtter double typen og derfor heller ikke DataInputStream.readDouble(), kan jeg jo ikke umiddelbart få tal-værdien. Serveren kan der ikke laves om i.
Jeg har allerede en klasse hvorved jeg kan repræsentere en double værdi. Dette virker ved at benytte to int værdier i klassen. Hvis den ene værdi er 2 og den anden er 129, så ved jeg at værdien f.eks. er 1,29 (2 decimaler efter komma). Så det er altså ikke noget problem at double typen ikke findes i MIDP.
Det jeg mangler er "bare" noget kode der kan omforme de 8 bytes der sendes fra serveren, når den kalder DataInputStream.writeDouble(), til f.eks. sådanne to heltals-værdier som er nævnt ovenfor. Eller bare noget andet MIDP kompatibelt kode så jeg kan se hvad det er for en værdi serveren sender.
I Sun's source kode kan jeg se at de benytter nedenstående kode til at læse en double: ------------------------------------------------ long heltal = readLong(); double kommatal = Double.longBitsToDouble(heltal); ------------------------------------------------
Men dette hjælper mig heller ikke, da der ikke er kode til Double.longBitsToDouble() metoden. Hvordan får jeg ovenstående long værdi ("heltal"), koverteret på en måde så jeg kan se hvilken værdi serveren sender..??
Ok, kan se at der er nogle gode beskrivelser af formattet, så jeg må bare selv implementere en klasse ud fra dette. Det er desværre ikke til at finde noget kode nogen steder. Tak for hjælpen..
Så man: - stiller et 200 point spørgsmål - lige så snart der er kommet nogle brugbare ideer på bordet så lukker man spørgsmålet og tager point selv - laver selv en løsning udfra de ideer man har fået gratis ?
Jeg havde selv allerede set de der IEEE beskrivelser i forvejen!!! Jeg faldt over RIGTIG RIGTIG MANGE standard beskrivelser i min søgning på internettet efter noget kode - inden jeg stillede spørgsmålet her.. Så dine kommentare hjalp mig altså desværre ikke. Jeg var ude efter noget kode. Hvis jeg ville lave det selv (som jeg nu har gjort) havde jeg sgu ikke bedt om hjælp på eksperten. Og nu har jeg altså selv nået at lave det, inden nogen andre kom med en løsning..
Helt ærlig!! 200 point for at sende et link der ikke engang giver løsningen??? Jeg var ligsom godt klar over at man skal udtrække de enkelte bits.. Det kan vel ikke komme som nogen overraskelse for nogen. Metoden som jeg nævnte hedder også: longBitsToDouble(). Jeg var bare flink og ville sige tak for det halve minut du brugte på at sende de links..
Jeg har vist ikke på noget som helst tidspunkt gjordt krav på 200 point for de links !!
Men der står ikke et ord i dit spørgsmål om at du har fundet ud af hvad format det er. Og det må være spørgers problem ikke svarers problem at spørgsmålts tekst ikke giver det korrekte indblik i problem stillingen.
Jeg ville ikke have sagt et ord, hvis du have tilbudt 25 point og givet 175 for noget konkret kode. Og hvis du havde postet din kode før andre kunne du selv have reclaimet dem.
Jeg ville for den sags skyld heller ikke have sagt et ord, hvis en anden end dig havde postet koden og han havde fået alle 200.
Og spørgsmålet er lukket så det er ikke teknisk muligt at uddele point igen.
Men jeg er ikke glad for "tag selv point folk" generelt. Og tingene skal gå fair til.
public static final MinDouble pureLongBitsToMinDouble(long bits) { boolean signBit = (bits & 0x8000000000000000L) != 0;
long fractionBits = (bits & 0x000FFFFFFFFFFFFFL);
short exponentBits = (short)((bits >> 52) & 0x7FF);
long m; int e; if (exponentBits == 0) { m = signBit ? -fractionBits : fractionBits; e = 1 - 1023; } else { long fullMantissa = fractionBits | 0x0010000000000000L; m = signBit ? -fullMantissa : fullMantissa; e = exponentBits - 1023; } // Udfør konvertering: MinDouble result = new MinDouble(m).mul(MinDouble.pow(new MinDouble(2), new MinDouble(e - 53 + 1))); // Eller ved brug af den normale double type: double dResult = m * Math.pow(2, (int)(e - 53 + 1));
return result; }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.