Convertire i byte a pezzi
Domanda
Sto lavorando con Java.
Ho una matrice di byte (8 bit in ciascuna posizione della matrice) e quello che occorre fare è unire 2 dei valori dell'array e ottenere un valore.
Cercherò di spiegarmi meglio; Sto estrazione di dati audio da un file audio. Questi dati vengono memorizzati in una matrice di byte. Ogni campione audio ha una dimensione di 16 bit. Se la matrice è:
byte [] Audiodata;
Che cosa ho bisogno è quello di ottenere valore da 1 campioni Audiodata [0] e Audiodata [1] al fine di ottenere 1 campione audio.
Qualcuno mi può spiegare come fare questo?
Grazie in anticipo.
Soluzione
Io non sono uno sviluppatore Java quindi questo potrebbe essere completamente off-base, ma avete considerato utilizzando un ByteBuffer ?
Altri suggerimenti
Si supponga che il LSB è a dati [0]
int val;
val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);
Come suggerito in precedenza, Java ha classi per aiutarvi con questo. Si può avvolgere la matrice con un ByteBuffer e quindi ottenere un IntBuffer visione di esso.
ByteBuffer bb = ByteBuffer.wrap(audioData);
// optional: bb.order(ByteOrder.BIG_ENDIAN) or bb.order(ByteOrder.LITTLE_ENDIAN)
IntBuffer ib = bb.asIntBuffer();
int firstInt = ib.get(0);
ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();
Il vantaggio del codice di cui sopra è che si può continuare a leggere il resto di 'dati' nello stesso modo.
Una soluzione più semplice per appena due valori potrebbe essere:
short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));
Questa semplice soluzione estrae due byte, e li pezzi insieme con il primo byte essendo i bit di ordine superiore e il secondo byte i bit di ordine inferiore (questo è noto come Big Endian, se la matrice di byte contiene dati Little-Endian, si dovrebbe spostare il secondo byte sopra, invece, per i numeri a 16 bit;. per i numeri little-endian a 32 bit, si dovrà invertire l'ordine di tutti i 4 byte, perché interi di Java seguono ordinazione Big-Endian)
modo più semplice in Java per analizzare una matrice di byte di bit è JBBP Utilizzo
class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);
il codice inserirà i bit di ciascun byte analizzati da 8 byte nella matrice bit dell'istanza classe Parsed
È possibile convertire in short
(2 byte) dalla logica o-ing i due byte insieme:
short value = ((short) audioData[0]) | ((short) audioData[1] << 8);
vi consiglio di dare un'occhiata a Preon . In Preon, si sarebbe in grado di dire qualcosa di simile:
class Sample {
@BoundNumber(size="16") // Size of the sample in bits
int value;
}
class AudioFile {
@BoundList(size="...") // Number of samples
Sample[] samples;
}
byte[] buffer = ...;
Codec<AudioFile> codec = Codecs.create(AudioFile.class);
AudioFile audioFile = codec.decode(buffer);
byte myByte = 0x5B;
boolean bits = new boolean[8];
for(int i = 0 ; i < 8 ; i++)
bit[i] = (myByte%2 == 1);
I risultati è una matrice di zeri e quelli dove 1=TRUE
e 0=FALSE
:)