Frage

In Java gibt es kein vorzeichenloses Byte.

Wenn Sie mit Low-Level-Code arbeiten, müssen Sie gelegentlich mit Bytes arbeiten, deren vorzeichenlose Werte größer als 128 sind, was dazu führt, dass Java sie als negative Zahl interpretiert, da das MSB für das Vorzeichen verwendet wird.

Was ist ein guter Weg, dies zu umgehen?(Zu sagen, kein Java zu verwenden, ist keine Option)

War es hilfreich?

Lösung

Wenn Sie einen einzelnen Wert aus dem Array lesen, kopieren Sie ihn in etwas wie einen Short- oder Int-Wert und konvertieren Sie die negative Zahl manuell in den positiven Wert, den er haben sollte.

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

Eine ähnliche Konvertierung können Sie beim Schreiben in das Array durchführen.

Andere Tipps

Es ist tatsächlich möglich, die if-Anweisung und den Zusatz loszuwerden, wenn Sie es so machen.

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

Auf diese Weise interpretiert Java das Byte nicht als negative Zahl und dreht auch das Vorzeichenbit der Ganzzahl um.

Die Verwendung von Ints ist im Allgemeinen besser als die Verwendung von Shorts, da Java intern sowieso 32-Bit-Werte verwendet (auch für Bytes, es sei denn, sie befinden sich in einem Array). Daher wird durch die Verwendung von Ints eine unnötige Konvertierung in/von Short-Werten im Bytecode vermieden.

Wahrscheinlich ist es am besten, eine Ganzzahl anstelle eines Bytes zu verwenden.Es bietet Platz für Zahlen größer als 128, ohne dass ein spezielles Objekt zum Ersetzen von Bytes erstellt werden muss.

Dies wird auch von Leuten vorgeschlagen, die schlauer sind als ich (alle)

Der beste Weg, Bitmanipulationen/vorzeichenlose Bytes durchzuführen, ist die Verwendung intS.Obwohl sie signiert sind, verfügen sie über zahlreiche Ersatzbits (insgesamt 32), die als vorzeichenloses Byte behandelt werden können.Außerdem konvertieren alle mathematischen Operatoren kleinere Zahlen mit fester Genauigkeit in int.Beispiel:

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

Aus diesem Grund ist es am besten, einfach bei der Ganzzahl zu bleiben und sie zu maskieren, um die Bits zu erhalten, an denen Sie interessiert sind.Beispiel:

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

Hier finden Sie weitere Informationen zu primitiven Java-Typen http://mindprod.com/jgloss/primitive.html

Eine letzte triviale Anmerkung: In Java gibt es eine vorzeichenlose Zahl mit fester Genauigkeit.Das ist das verkohlen Primitive.

Ich weiß, dass dies eine sehr späte Antwort ist, aber ich bin auf diesen Thread gestoßen, als ich genau das Gleiche tun wollte.Das Problem besteht lediglich darin, festzustellen, ob ein Java-Byte > 127 ist.

Die einfache Lösung ist:

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

Wenn das eigentliche Problem stattdessen >128 ist, genügt das Hinzufügen einer weiteren Bedingung zu dieser if-Anweisung.

Ich denke, Sie könnten einfach einen Kurzschluss verwenden, um sie aufzubewahren.Nicht sehr effizient, aber wirklich die einzige Option, abgesehen von dem enormen Aufwand, den ich gesehen habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top