Question

Je travaille avec java.

Je (dans chaque position du tableau 8 bits) et ce que je dois faire est de mettre ensemble deux des valeurs du tableau et d'obtenir une valeur d'un tableau d'octets.

Je vais essayer de me expliquer mieux; Je l'extraction de données audio à partir 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 le suivant:

byte [] Audiodata;

Ce que je dois est d'obtenir 1 valeur à partir d'échantillons Audiodata [0] et Audiodata [1] afin d'obtenir 1 échantillon audio.

Quelqu'un peut-il me expliquer comment faire?

Merci d'avance.

Était-ce utile?

La solution

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

Autres conseils

On suppose que la LSB est à données [0]

int val;

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

Comme suggéré précédemment, Java a des classes pour vous aider. Vous pouvez envelopper votre tableau avec un ByteBuffer puis obtenir un IntBuffer vue 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);
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 (ce qui est connu sous le nom Big-Endian, si votre tableau d'octets contenait des données Little Endian, vous décaler le second octet sur place pour les numéros 16 bits;. pour petit-boutiste numéros 32 bits, vous devez inverser l'ordre des 4 octets, parce que les entiers de Java suivent la commande Big-Endian)

façon plus simple en Java pour analyser un tableau d'octets à bits est de utilisation JBBP

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

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

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

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

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);
byte myByte = 0x5B;

boolean bits = new boolean[8];

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

Les résultats est un tableau de zéros et de uns et où 1=TRUE 0=FALSE:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top