Domanda

In Java non esiste un byte senza segno.

Lavorando con codice di basso livello, occasionalmente è necessario lavorare con byte che hanno valori senza segno maggiori di 128, il che fa sì che Java li interpreti come un numero negativo a causa del MSB utilizzato per il segno.

Qual è un buon modo per aggirare questo problema?(Dire di non usare Java non è un'opzione)

È stato utile?

Soluzione

Quando leggi un singolo valore dall'array, copialo in qualcosa come short o int e converti manualmente il numero negativo nel valore positivo che dovrebbe essere.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

Puoi eseguire una conversione simile quando scrivi nell'array.

Altri suggerimenti

In realtà è possibile eliminare l'istruzione if e l'aggiunta se lo fai in questo modo.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

In questo modo Java non interpreta il byte come un numero negativo e inverte anche il bit di segno sull'intero.

L'uso degli int è generalmente migliore dell'uso degli shorts perché Java utilizza comunque valori a 32 bit internamente (anche per i byte, a meno che non siano in un array), quindi l'uso degli int eviterà conversioni non necessarie da/verso valori short nel bytecode.

Probabilmente la soluzione migliore è utilizzare un numero intero anziché un byte.Ha lo spazio per consentire numeri maggiori di 128 senza il sovraccarico di dover creare un oggetto speciale per sostituire il byte.

Questo me lo suggeriscono anche le persone più intelligenti di me (tutti)

Il modo migliore per eseguire la manipolazione dei bit/byte senza segno è utilizzare intS.Anche se sono firmati, hanno molti bit di riserva (32 in totale) da trattare come un byte senza segno.Inoltre, tutti gli operatori matematici convertiranno i numeri a precisione fissa più piccoli in int.Esempio:

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

Per questo motivo è meglio attenersi al numero intero e mascherarlo per ottenere i bit che ti interessano.Esempio:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

Ecco alcune informazioni in più sui tipi primitivi Java http://mindprod.com/jgloss/primitive.html

Un'ultima nota banale, in Java esiste un numero di precisione fissa senza segno.Questo è il car primitivo.

So che questa è una risposta molto tardiva, ma mi sono imbattuto in questo thread mentre cercavo di fare esattamente la stessa cosa.Il problema sta semplicemente cercando di determinare se un byte Java è> 127.

La soluzione semplice è:

if((val & (byte)0x80) != 0) { ... }

Se invece il vero problema è >128, basta aggiungere un'altra condizione all'istruzione if per risolvere il problema.

Immagino che potresti semplicemente usare un corto per conservarli.Non molto efficiente, ma davvero l'unica opzione oltre allo sforzo erculeo che ho visto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top