Konvertieren von 2 oder 4 bytes signed/unsigned short/int
Habe ich zum konvertieren von bytes signed/unsigned int oder short.
Den Methoden unten sind richtig? Die signierte und die unsignierte?
Byte-Reihenfolge: LITTLE_ENDIAN
public static int convertTwoBytesToInt1(byte b1, byte b2) {
return (int) ((b2 << 8) | (b1 & 0xFF));
}
VS.
public static int convertTwoBytesToInt2(byte b1, byte b2) {
return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));
}
und
public static int convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){
return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);
}
VS.
public static int convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){
return (int) (( (b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF));
}
Ich bin interessiert nur in dieser Umwandlung bildet. Danke!
- Ich würde ByteBuffer verwenden, da dies viel effizienter und können Sie nur setzen
.order(ByteOrder.LITTLE_ENDIAN)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Methode (
convertXXXToInt1()
) jedes Paares ist unterzeichnet, die zweite (convertXXXToInt2()
) nicht signiert ist.Jedoch, Java
int
ist immer unterschrieben, also, wenn das höchste bit vonb4
gesetzt ist, das ErgebnisconvertFourBytesToInt2()
negativ sein wird, obwohl dies soll der "unsigned" - version.Angenommen, ein
byte
Wertb2
-1 ist, oder 0xFF hexadezimal. Die<<
Betreiber dazu, dass es "gefördert" werden, um eineint
- Typ mit einem Wert von -1 oder 0xFFFFFFFF. Nach der Verschiebung von 8 bits, es werden 0xFFFFFF00, und nach einer Schicht von 24 bytes, es werden 0xFF000000.Jedoch, wenn Sie die bitweise
&
Betreiber, die höherwertigen bits werden auf null gesetzt. Dies löscht die Zeichen-Informationen. Hier sind die ersten Schritte der beiden Fälle, ausgearbeitet im detail.Unterzeichnet:
Unsigned:
+
Betreiber. Ich habe nicht bemerkt, dass vor, weil die anderen nutzen die|
Betreiber, die sich bevorzugt für die bit-manipulation. Der Ausdruck sollte(int)((b4<<24) | ((b3 & 0xFF)<<16) | ((b2 & 0xFF)<<8) | (b1 & 0xFF))
Gibt es ein problem mit der 4-byte-unsigned-Wandlung, denn es passt nicht in einen int. Die Routinen, die unten korrekt funktionieren.