Pergunta

Eu estou trabalhando com java.

Eu tenho uma matriz de bytes (8 bits em cada posição da matriz) eo que eu preciso fazer é montar 2 dos valores da matriz e obter um valor.

Vou tentar me explicar melhor; Estou extraindo dados de áudio a partir de um arquivo de áudio. Estes dados são armazenados em uma matriz de bytes. Cada amostra de áudio tem um tamanho de 16 bits. Se a matriz é:

byte [] audioData;

O que eu preciso é obter um valor a partir de amostras audioData [0] e audioData [1], a fim de obter uma amostra de áudio.

Alguém pode me explicar como fazer isso?

Agradecemos antecipadamente.

Foi útil?

Solução

Eu não sou um desenvolvedor Java assim que este poderia ser completamente off-base, mas você já pensou em usar um ByteBuffer ?

Outras dicas

Suponha que a LSB é a data [0]

int val;

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

Como sugerido antes, Java tem classes para ajudá-lo com isso. Você pode embrulhar sua matriz com um ByteBuffer e, em seguida, obter um IntBuffer vista do mesmo.

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

A vantagem do código acima é que você pode manter-se ler o resto de 'dados' da mesma forma.

Uma solução simples para apenas dois valores podem ser:

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

Esta simples extractos solução de dois bytes, e peças-los juntamente com o primeiro byte sendo os bits de ordem superior e o segundo byte os bits de ordem inferior (isto é conhecido como Big-Endian; se a sua matriz de bytes contidos dados pequeno-Endian, você mudaria o segundo byte mais em vez de números de 16 bits;. para números little-endian de 32 bits, você teria que inverter a ordem de todos os 4 bytes, porque inteiros do Java siga ordenação Big-Endian)

maneira mais fácil em Java para analisar uma matriz de bytes para os bits é uso JBBP

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

o código vai colocar os bits processadas que são de cada byte como 8 bytes na matriz pedaços da instância de classe Parsed

Você pode converter a uma short (2 bytes) por lógica ou-ing os dois bytes juntos:

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

Eu sugiro que você dê uma olhada Preon . Em Preon, você seria capaz de dizer algo como isto:

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

Os resultados é uma matriz de zeros e uns onde 1=TRUE e 0=FALSE:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top