Care este cel mai bun mod de a lucra în jurul faptului că toți octeții Java sunt semnate?

Î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)

0
fr hi bn

6 răspunsuri

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.

0
adăugat

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.

0
adăugat
Mult mai ușor și mai eficient de a face valoarea int = (foobar [10] & 0xFF);
adăugat autor Lawrence Dol, sursa
Poate, dar am vrut ca codul meu să fie cât mai clar și mai instructiv posibil. De asemenea, nu știu ce înseamnă "&" pentru numerele negative din Java (cel puțin nu fără googling), așa că am jucat-o în siguranță.
adăugat autor pauldoo, sursa
M-am gândit că probabil 0xFF ar fi tratat ca un octet semnat (care ar fi -1), apoi semnul extins la un număr întreg semnat pe 32 de biți (care ar da 0xFFFFFFFF aka -1) înainte de a fi trecut ca argument la '&'. Acest lucru ar da rezultatul incorect. Este clar din discuție că Java nu va face acest lucru, dar m-am gândit cel mai bine să îl joc în siguranță.
adăugat autor pauldoo, sursa
de ce ar face și să facă ceva diferit pentru numere negative. Și este o operație booleană care funcționează pe biți individuali, știe, verifică sau îngrijește dacă un număr este pozitiv, negativ sau orice altă valoare.
adăugat autor mP., sursa

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.

0
adăugat
Asta este foarte adevărat, deși obțineți un octet suplimentar acolo pentru a forța valorile în și înapoi de octeți, astfel încât să existe o mică cantitate aeriene. Readability> Beneficii mici intangibile deși.
adăugat autor izb, sursa
Ei bine, dacă valoarea va fi întotdeauna un octet (adică 8 biți), atunci folosirea byte este mai clară și mai bine transmite intenția codului, așa că îl folosesc pentru citire, chiar dacă folosește același spațiu ca un int .
adăugat autor sleske, sursa
De asemenea, realizarea faptului că int se împrăștie mai bine scopului propus nu va ajuta dacă se va baza pe o bibliotecă care folosește byte undeva (stack-ul USB de pe Android vine în minte ).
adăugat autor user149408, sursa

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)

0
adăugat

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 .

0
adăugat

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.

0
adăugat