og jeg ved f.eks. at elementerne 91,99,78,45,99,97,114,103,111,93 altså de første 10 elementer udgøre en streng, og det er ikke noget problem at oversætte da man til en streng konstruktør kan gi et byte[], så det er fint nok...
Jeg så også at 14,0,0,0 udgører et int32, som jeg skal bruge og at 126,91,-86,68 udgører et float32 som jeg skal bruge, men hvordan oversætter jeg det til henholdsvis int og float....????
Også et lille spg.
jeg har også et array der hedder {-1,-1,-1,-1} udgører int32 værdien -1 ? Jeg ved godt at byteværdien for 255 må være 11111111, og 32 1-taller må være -1, pga. signed bit, men hvordan for jeg mit array oversat til int t = -1... ?
Tak for hjælpen..
Kasper.
P.S. hvis du pludselig ser et taller og nuller overalt, så tag en pause, det er det jeg lider af lige nu. At stirre sig blind hedder det....:-)
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Jeg kan gi lidt info om hvordan jeg har forsøgt mig med det indtil nu, man kan jo via Integer klassen oversætte fra int til bitstrenge, altså sådan ca. sådan her :
Men hvad så med negative tal...? Så går den da helt amok, plus at det ikke svare helt til det jeg regnede med :
int b1 = 14; int b2 = 0; int b3 = 0; int b4 = 0; int resultb = b1*255^3+b2*255^2+b3*255+b4; System.out.println(\"resultb : \" + resultb); gir ; resultb : 3571
mens mit andet resultat er 112, som er mere rimeligt....
Det hele handler om at jeg har en UDP pakke, som jeg skal oversætte. Jeg har modtaget pakkens indhold som et byteArray, og jeg ved hvor der f.eks. er en streng og en Int32 osv. i dette byte array, det skal jeg så ha trukket ud af byte arrayet....!
b1<<24 betyder at vi tager bitmønstret for b1 og sætter 24 nuller bagefter. På den måde ender b1 oppe i de 8 højeste bits i en 32bits integer. På den måde klistrer vi de 4 bytes sammen til en integer.
Kan du give mig nogle eksempler jeg kan teste med (dvs nogle byteværdier og deres tilsvarende int32 og float32 værdier)? Jeg tror følgende er ok, men det skal lige testes. byte b1 = 0x3f; byte b2 = -128; byte b3 = 1; byte b4 = 1;
int converted = (b1<<24) | (b2<<16) | (b3<<8) | b4; System.out.println(\"resultat som integer: \" + converted);
int temp;
boolean negative = (b1 >>> 7)!=0;
temp = b1 & 0x7f; // fjern første bit int temp2 = (b2 >>> 7) & 0x1; temp = (temp << 1) | (temp2); // temp holder nu eksponentbitsne int exponent = temp-127; System.out.println(\"exp: \" + exponent); temp = b2 & 0x7f;
int mantisse = 0x800000 + (temp<<16) + (b3<<8) + b4; System.out.println(\"mant: \" + mantisse); double d = mantisse * java.lang.Math.pow(2, exponent); if (negative) d *= -1; System.out.println(\"resultat som float: \" + d);
Smæk en ByteArrayInputStream uden på dit bytearray, dernæst en DataInputStream ud over din ByteArray, så kan du bruge DataInputStreams metoder til læsning, ala:
byte[] bytes = udp.receive(); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); String s = dis.readUTF(); long l = dis.readLong(); float f = dis.readFloat();
(Jeg har ikke lige kigget på din encoding af floats, int endians, men det kan du selv kigge på)
Tak til logical, det virker som det skal, men din sidste kommentar, er jeg ikke med på. Jeg har ikke meget hukommelse tilbage om encoding af floats og little og big endian, så har du mod på at se på det også ??????
Problemet med rå datatransmission er at der er nogle detaljer, som skal afvejes.
Nogle har angivet en protokol for hvordan de sender ints, strings og float. Afhængig af hvordan de er lagt i en datastrøm kan der være flere problemer. Jeg beskriver et af dem nederst. Hvis du skulle kommunikere med en klient, som ikke er skrevet i java, er der mange måder, hvorpå du lægge strenge ints floats etc. Alene spørgsmålet om en int er 2, 4 eller 8 bytes lang (signed/unsigned), om strenge er null-termineret etc. er faktisk et problem, som man nogle gange skal tage alvorligt.
Hvis det virker for dig, anvender du samme string encoding som din server, samme int definition, og samme float definition. Da jeg ikke lige kender din protokol kunne jeg jo ikke gøre mig nogen forudantagelser om dette.
Et eksempel (endians):
Når man har en 32 bit int, skal den flyttes ud som 4 bytes, men i hvilken rækkefølge? Nogle platforme sender den mest betydende bit (MSB) først, mens andre sender den mindst betydende først (LSB). Dette er henholdsvis big-endian og litte-endian problemet (opkaldt efter Gullivers rejse, hvor nogle mennesker lå i krig om man spiste æg fra den spidste side eller den flade side. Kan ikke huske hvilken side af ægget, der er henholdsvis little og big endian, men hva :-)
Nu køre hele lortet, dog lige med undtagelse af en lille lidt vigtig ting......
DEN LEDE FLOAT.....
så logical og andre her er den sidste nød :
jeg har et byte array der f.eks. hedder : {68,-27,43,-122} Dette bytearray udgøre en float32. Denne float32 skal repræcentere en tid, der kan oversættes til min:sek. Når man finder denne float giver den float værdien : 1833.3601, hvilket af andre bliver oversat til 00:29, hvilket også er lidt mærkeligt....Men det skulle altså angive et tidspunkt.....
Det særlige er jo, at det er så lavt et tal (i minutter sekunder), så man skulle tro, at det enten var tallet 29 i packed format eller noget, men float->time??
Tog det som et heltal, konverterede til en dato og tog timer og minutter derfra (Orv, opdagede en fejl, det var minutter og sekunder, der var interessant. Så giver det 10:04:29 (og 10:04 ikke 10:41)).
Håber alle de nestede paranteser giver mening, her er en stump kode: byte[] b = {68,-27,43,-122}; DataInputStream dis = new DataInputStream(new ByteArrayInputStream(b)); int i = dis.readInt(); Date d = new Date((long)i); SimpleDateFormat formatter = new SimpleDateFormat(\"hh:mm:ss\"); System.out.println(formatter.format(d));
Yeps yeps det virker. Tak for hjælpen alle sammen. logical var den som kom med svaret.
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.