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.

È stato utile?

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:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top