zeri Java strippaggio dalla funzione
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
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);