2009-06-03 9 views
4

Je travaille avec Java. J'ai un tableau d'octets (8 bits dans chaque position du tableau) et ce que je dois faire est de rassembler 2 des valeurs du tableau et d'obtenir une valeur.Convertir des octets en bits

Je vais essayer de m'expliquer mieux; J'extrais des données audio d'un fichier audio. Ces données sont stockées dans un tableau d'octets. Chaque échantillon audio a une taille de 16 bits. Si le tableau est:

octet [] audioData; Ce dont j'ai besoin est d'obtenir 1 valeur à partir des échantillons audioData [0] et audioData [1] afin d'obtenir 1 échantillon audio.

Quelqu'un peut-il m'expliquer comment faire?

Merci d'avance.

Répondre

6

Je ne suis pas un développeur Java si cela pourrait être complètement hors de la base, mais avez-vous envisagé d'utiliser un ByteBuffer?

+2

Ce n'est pas complètement hors base. –

4

Assumer le bit de poids faible est à données [0]

int val; 

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

cela ne concerne pas l'extension de signe sur l'octet 1 – newacct

+0

la question était de savoir comment configurer la valeur entière en lisant octet-byte. Donc, à chaque fois que le nombre entier est prolongé, il restera le même, je ne suis absolument pas sûr que le cas là nous devons en prendre soin. –

0

Vous pouvez convertir en un short (2 octets) par logique ou les deux octets ing ensemble:

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

Non, trop simple; doit utiliser le masquage pour éviter l'extension du panneau. – StaxMan

+0

+1 pour signaler mon erreur. Éditera (ou effacera) plus tard. –

+0

S'il vous plaît modifier, je veux apprendre – dedalo

1

Comme suggéré précédemment, Java a des cours pour vous aider. Vous pouvez envelopper votre tableau avec un ByteBuffer, puis obtenir une vue IntBuffer de celui-ci.

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

ShortBuffer peut être plus approprié ici. –

0

Je vous suggère de jeter un oeil à Preon. En Preon, vous seriez en mesure de dire quelque chose comme ceci:

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); 
1
ByteInputStream b = new ByteInputStream(audioData); 
DataInputStream data = new DataInputStream(b); 
short value = data.readShort(); 

L'avantage du code ci-dessus est que vous pouvez continuer à lire le reste de la même manière « données ».

Une solution plus simple pour deux valeurs pourrait être:

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

Cette solution simple extrait deux octets, et les morceaux ensemble avec le premier octet étant les bits d'ordre supérieur et le second octet les bits d'ordre inférieur (ceci est connu comme Big-Endian, si votre tableau d'octets contenait des données Little-Endian, vous déplaceriez le second octet à la place pour les nombres à 16 bits, pour les nombres à 32 bits Little-Endian, vous devrez inverser l'ordre de tous 4 octets, car les entiers de Java suivent l'ordre big-endian).

-4
byte myByte = 0x5B; 

boolean bits = new boolean[8]; 

for(int i = 0 ; i < 8 ; i++) 
    bit[i] = (myByte%2 == 1); 

Le résultat est un tableau de zéros et ceux où 1=TRUE et 0=FALSE :)

+0

Ne voulez-vous pas quelque chose comme 'bit [i] = ((myByte & (1 << i))! = 0);'? Je ne pense pas que cela fonctionnera comme écrit. – Rob

0

façon plus facile en Java pour analyser un tableau d'octets à bits est JBBP usage

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

le code placer les bits analysés de chaque octet comme 8 octets dans le tableau de bits de l'instance de la classe Parsed

Questions connexes