În Java, nu există un astfel de lucru ca un octet nesemnat.
Dacă lucrați cu un cod de nivel scăzut, ocazional trebuie să lucrați cu octeți care au valori nesemnate mai mari de 128, fapt care determină Java să le interpreteze ca număr negativ din cauza faptului că MSB este folosit pentru semnare.
Care este o modalitate bună de a rezolva asta? (Spunând că nu folosiți Java nu este o opțiune)
Cred că ai putea folosi doar un scurt pentru a le stoca. Nu foarte eficientă, dar cu adevărat singura opțiune în afară de un efort herculean pe care l-am văzut.
Probabil că cel mai bun pariu este să utilizați un integer mai degrabă decât un octet. Are spațiu pentru a permite numerelor mai mari de 128, fără a avea sarcina de a crea un obiect special care să înlocuiască octetul.
Acest lucru este sugerat și de oamenii mai deștepți decât mine (toată lumea)
Când citiți o singură valoare din matrice copiați-o în ceva de tipul scurt sau int și convertiți manual numărul negativ în valoarea pozitivă ar trebui să fie.
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256//Patch up the 'falsely' negative value
Puteți face o conversie similară atunci când scrieți în matrice.
Cel mai bun mod de a face manipularea biților/bytes nesemnate este prin utilizarea int s. Chiar dacă sunt semnați, ei au destule biți de rezervă (32 total) pentru a trata ca un octet nesemnat. De asemenea, toți operatorii matematici vor converti numere de precizie fixe mai mici la int . Exemplu:
short a = 1s;
short b = 2s;
int c = a + b;//the result is up-converted
short small = (short)c;//must cast to get it back to short
Din acest motiv cel mai bine este să vă lipiți de întreg și să o mascați pentru a obține biții care vă interesează. Exemplu:
int a = 32;
int b = 128;
int foo = (a + b) | 255;
Here is some more info on Java primitive types http://mindprod.com/jgloss/primitive.html
O ultimă notă trivială, există un număr de precizie nesemnificat fix în Java. Acesta este primitivul char .
Utilizarea ints este, în general, mai bună decât folosirea de pantaloni scurți deoarece java utilizează oricum orice valoare pe 32 de biți (chiar și pentru octeți, cu excepția cazului în tablouri), astfel încât utilizarea inturilor va evita conversia inutilă la/de la valori scurte în bytecode.
I know this is a very late response, but I came across this thread when trying to do the exact same thing. The issue is simply trying to determine if a Java byte is >127.
Soluția simplă este:
if((val & (byte)0x80) != 0) { ... }
If the real issue is >128 instead, just adding another condition to that if-statement will do the trick.