Pregunta

Estoy trabajando con Java.

Tengo una matriz de bytes (8 bits en cada posición de la matriz) y lo que necesita hacer es poner juntos 2 de los valores de la matriz y obtener un valor.

Voy a tratar de explicar mejor a mí mismo; Estoy extraer datos de audio de un archivo de audio. Estos datos se almacenan en una matriz de bytes. Cada muestra de audio tiene un tamaño de 16 bits. Si la matriz es:

byte [] AudioData;

Lo que necesito es conseguir 1 valor a partir de muestras AudioData [0] y AudioData [1] con el fin de obtener 1 muestra de audio.

Puede alguien explicar cómo hacer esto?

Gracias de antemano.

¿Fue útil?

Solución

No soy un desarrollador de Java por lo que este podría ser completamente fuera de la base, pero ¿ha considerado el uso de un ByteBuffer ?

Otros consejos

Suponga que el LSB está en datos [0]

int val;

val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);

Como se ha sugerido antes, Java tiene clases para ayudarle con esto. Usted puede envolver su matriz con una ByteBuffer y luego obtener una IntBuffer vista de ella.

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

La ventaja del código anterior es que se puede seguir leyendo el resto de los 'datos' de la misma manera.

Una solución más simple para sólo dos valores podría ser:

short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));

Esta sencilla solución extrae dos bytes, y piezas de ellos junto con el primer byte de ser los bits de orden superior y el segundo byte los bits de orden inferior (esto se conoce como Big-Endian; si su matriz de bytes contenía datos de Little-Endian, que desplazaría el segundo byte más en lugar de números de 16 bits;. para números de Little Endian de 32 bits, que tendría que invertir el orden de los 4 bytes, porque los números enteros de Java siguen pedido Big-Endian)

manera más fácil en Java para analizar una matriz de bytes a los bits es JBBP uso

  class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
  final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);

el código colocará los bits analizados de cada byte como 8 bytes en los bits de selección de la instancia de clase Parsed

Puede convertir a un short (2 bytes) por lógica o-ción de los dos bytes juntos:

short value = ((short) audioData[0]) | ((short) audioData[1] << 8);

Le sugiero que eche un vistazo a Preon . En Preon, que sería capaz de decir algo como esto:

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

Los resultados es una matriz de ceros y unos donde 1=TRUE y 0=FALSE:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top