Converter bytes em pedaços
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.
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
:)