[java] unsigned byte, bestaat die??

Pagina: 1
Acties:

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
Ik ben hier op school bezig met een project, waarin je oa van een aantal (afstands)sensoren data krijgt (handelt collega af in stukje C op chip). Via een com-poort krijg ik de gegevens binnen en moet ik die ook weer terugsturen.

Het probleem hierbij is, dat een van de waarde die heen en weer gestuurd worden een byte is, met waarden van 0-255 (unsigned dus). Als ik hiervoor de gewone 'java byte' gebruik, krijg ik hier 'uiteraard' een verkeerde negatieve waarde voor. Ik kan natuurlijk een leuk algoritme gaan schrijven dat alles weer omzet, maar is er niet een nettere manier in de vorm van een 'unsigned byte' look-a-like?

Ik weet intussen dat..
Java does not support unsigned data types except for char, which is a 16-bit unsigned integer. Methods that accept or return other unsigned data types cannot be used from Java.
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/ctrans_9wkf.asp)

En ik heb al ontdekt dat de java char, niet zoals in c(++) een byte representeerd, maar (unicode) 2 bytes. (zie ook hier. In dit topic staat ook over chars <-> bytes:
Als je gaat casten moet je altijd oppassen voor dit soort dingen. De upcast van byte naar char zal wel goed gaan, maar de downcast van char naar byte. Oei oei oei....

Nogmaal een char is geen byte.
Een char is een unsigned short, en da's twee bytes.
Is er een andere vorm van data waar ik als een unsigned byte mee kan werken?

Localhost is where the heart is


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
Na half GoT te hebben doorgespit zonder iets gevonden te hebben, vond ik via google dit stukje code:
code:
1
2
3
public static int unsignedByteToInt(byte b) {
    return (int) b & 0xFF;
    }

Ik test morgenochtend of ie werkt, maar ik neem aan van wel. Ik hoop dat ik door dit topic iemand anders weer een zoektocht bespaard heb..

De werking ontgaat mij even. Het oorspronkelijke getal wordt gecast naar een int, en daar komt dan nog een 'volle' signed byte bij op. hmm
code:
1
2
3
4
 10101010 = 42 unsigned: 170
 11111111 = 127 
 --------   (gaat in byte, dus carry wordt meegegeven)
100000001 = 257 :?

of is het dan 255 +(-1) = 254 (klopt nog steeds niet..)

Localhost is where the heart is


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
en daar komt dan nog een 'volle' signed byte bij op. hmm
de & operator is de bitwise AND, niet plus ofzo.

[edit]
ik zal ook nog ff uitleggen hoe het werkt, momentje :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 10 juni 2002 23:43 schreef SilentStorm het volgende:
De werking ontgaat mij even. Het oorspronkelijke getal wordt gecast naar een int, en daar komt dan nog een 'volle' signed byte bij op. hmm
met de AND operator kun je bits bewerken. Het levert een 1 op als beide bits 1 zijn, anders 0:
code:
1
2
3
4
5
6
a   b  a&b
---------
0   0   0
0   1   0
1   0   0
1   1   1

Het doel is om je byte zo te converteren naar een int zonder dat ie negatief wordt.
Als je een byte hebt met de waarde 0xff dan is dat -1. Je bedoelt echter gewoon 255.
Converteer je het naar een int, dan wordt de resulterende int ook (in bits): 11111111111111111111111111111111
Je wilt echter 255, dus zul je alle bits behalve de laatste 8 0 moeten maken, zo dus: 00000000000000000000000011111111

oplossing: AND het getal met 0xff, zodat de bovenste 24 bits op 0 komen te staan, en hopla: je hebt een unsigned byte in een integer
code:
1
2
3
4
11111111111111111111111111111111    -1
00000000000000000000000011111111   255
-------------------------------- AND
00000000000000000000000011111111   255

nog een voorbeeld: het getal 0x80 = 128. Door de sign wordt dit echter -128. Cast m naar int en AND m met 0xff:
code:
1
2
3
4
11111111111111111111111110000000  -128
00000000000000000000000011111111   255
-------------------------------- AND
00000000000000000000000010000000   128

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op maandag 10 juni 2002 23:57 schreef marcusk het volgende:

[edit]
ik zal ook nog ff uitleggen hoe het werkt, momentje :)
te laat :P

ik zal trouwens eens een oud topic opzoeken waarin ik (in volgens mbravenboer duidelijke taal ;)) uitleg hoe het zit met signed en unsigned integers... ogenblik

.edit: hmmz kan 'm niet vinden... sorry

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
hehe, hoeft al niet meer :)
te laat :P
tnx, hoef ik het tenminste niet meer in te typen ;)

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
Bedankt voor de uitleg. t is me weer helemaal duidelijk!

Localhost is where the heart is

Pagina: 1