Domanda

Sto cercando di capovolgere alcuni byte in giro in Java e la funzione che ho funziona correttamente per alcuni byte e non riuscendo per gli altri.

La funzione che sto usando è questo:

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;
}

E il codice che implementa questa è:

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;

I byte vengono letti da un ByteBuffer con la byteorder essendo little endian.

Ad esempio, i byte 00 01 B6 02 set la maschera di bit a:. 2B60100 - che funziona perfettamente nel mio programma

Tuttavia, se i byte sono A0 01 30 00, la maschera di bit è impostata su:. 3001A0 - che ha stipped l'ultimo a zero dalla maschera di bit

C'è un modo posso smettere di Java da stipping off zeri finali?

Mi auguro che abbia un senso.

Grazie

Tony

È stato utile?

Soluzione

Gli zeri non sono strappate -. Entrambi gli esempi citati sono corrette

  • 00 01 02 B6 è il 4 byte little-endian per 2B60100
  • A0 01 30 00 è il 4 byte little-endian per 3001A0

Gli zeri ci sono, ma probabilmente non solo in fase di stampa. La famiglia System.out.print di chiamate non stamperà leader zero cifre.

I potrebbe ricordare che il vostro metodo è inutilmente complessa. Ecco un unico metodo che calcola lo stesso valore:

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);
}

Altri suggerimenti

Sembra che si dispone di un ByteBuffer riempito con i vostri byte già. Perché non lasciare che il ByteBuffer invertire i byte per te? Basta aggiungere i byte nel buffer (BIG_ENDIAN è il default se si desidera aggiungere un numero intero, invece di bytes) e quindi modificare l'ordine prima di leggere il numero intero.

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

Se tutto quello che stai facendo è invertire l'ordine dei byte, lasciare che la biblioteca fare il lavoro per voi. Se ti è capitato di iniziare con un valore intero, si può anche solo fare questo:

int input = ...;
int output = Integer.reverseBytes(input);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top