Frage

Ich versuche, einige Bytes in Java herumzublättern, und die Funktion, die ich habe, arbeitet für einige Bytes korrekt und scheitert für andere.

Die Funktion, die ich benutze, lautet:

public static int foldInByte(int m, int pos, byte b) {
    int tempInt = (b << (pos * 8));
    tempInt = tempInt & (0x000000ff << (pos * 8));
    m = m | tempInt;
    return m;
}

Und der Code, der dies implementiert, ist:

byte[] bitMaskArray = new byte[]{
                            byteBuffer.get(inputIndex),
                            byteBuffer.get(inputIndex + 1),
                            byteBuffer.get(inputIndex + 2),
                            byteBuffer.get(inputIndex + 3)};
                        int tempInt = 0;

                        tempInt = foldInByte(0, 3, bitMaskArray[3]);
                        tempInt = foldInByte(tempInt, 2, bitMaskArray[2]);
                        tempInt = foldInByte(tempInt, 1, bitMaskArray[1]);
                        tempInt = foldInByte(tempInt, 0, bitMaskArray[0]);

                        bitMask = tempInt;

Die Bytes werden aus einem Bytebuffer gelesen, wobei der Byteorder wenig Endian ist.

Zum Beispiel setzen die Bytes 00 01 B6 02 die Bitmaske auf: 2B60100 - was in meinem Programm perfekt funktioniert.

Wenn die Bytes jedoch A0 01 30 00 sind, ist die Bitmaske auf: 3001A0 eingestellt - was die letzte Null aus der Bitmaske entworfen hat.

Gibt es eine Möglichkeit, Java davon abzuhalten, nachfolgende Nullen abzugeben?

Ich hoffe das ergibt Sinn.

Vielen Dank

Tony

War es hilfreich?

Lösung

Die Nullen werden nicht entzogen - beide zitierten Beispiele sind korrekt.

  • 00 01 B6 02 ist der 4-Byte Little-Endian für 2B60100
  • A0 01 30 00 ist der 4-Byte-Little-Endian für 3001A0

Die Nullen sind da, werden aber wahrscheinlich einfach nicht gedruckt. Das System von System.out.print wird nicht führende Null -Ziffern drucken.

Ich könnte erwähnen, dass Ihre Methode unnötig komplex ist. Hier ist eine einzelne Methode, die den gleichen Wert berechnet:

static int extractLittleEndian4(byte[] buf, int index)
{
    int a = buf[index+0]&0xff, b = buf[index+1]&0xff, c = buf[index+2]&0xff, d = buf[index+3]&0xff;
    return a | (b << 8) | (c << 16) | (d << 24);
}

Andere Tipps

Es sieht so aus, als hätten Sie bereits einen ByteBuffer, der bereits mit Ihren Bytes gefüllt ist. Warum lassen Sie den ByteBuffer nicht die Bytes für Sie umkehren? Fügen Sie einfach die Bytes zum Puffer hinzu (Big_endian ist die Standardeinstellung, wenn Sie eine Ganzzahl anstelle von Bytes hinzufügen möchten) und ändern Sie dann die Reihenfolge, bevor Sie die Ganzzahl lesen.

byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);

Wenn Sie nur die Byte -Bestellung umkehren, lassen Sie die Bibliothek die Arbeit für Sie erledigen. Wenn Sie zufällig mit einem Ganzzahlwert beginnen, können Sie dies sogar einfach tun:

int input = ...;
int output = Integer.reverseBytes(input);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top