Frage

Ich arbeite mit Java.

Ich habe einen Byte-Array (8 Bits in jeder Position des Arrays) und was ich brauche zu tun, zusammen 2 der Werte des Arrays zu setzen und einen Wert erhalten.

Ich werde versuchen, mich besser zu erklären; Ich Extrahieren von Audiodaten von einer Audiodatei. Diese Daten werden in einem Byte-Array gespeichert. Jede Audio-Probe hat eine Größe von 16 Bit. Wenn das Array ist:

byte [] Audiodaten;

Was ich brauche, ist einen Wert von Proben zu erhalten Audiodata [0] und Audiodaten [1], um 1 Hörprobe zu erhalten.

Kann mir jemand erklären, wie dies zu tun?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich bin kein Java-Entwickler, so könnte dies vollständig off-base, aber haben Sie darüber nachgedacht, eine ByteBuffer ?

Andere Tipps

Nehmen wir das LSB auf Daten [0]

int val;

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

Wie bereits angedeutet, hat Java-Klassen, Ihnen dabei zu helfen. Sie können Ihre Array mit einem ByteBuffer und dann ein IntBuffer Ansicht davon.

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

Der Vorteil des obigen Codes ist, dass Sie den Rest ‚Daten‘ auf die gleiche Weise lesen halten.

Eine einfachere Lösung für nur zwei Werte können sein:

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

Diese einfache Lösung extrahiert zwei Bytes und Stücke, um sie zusammen mit dem ersten Byte die höherwertigen Bits und das zweite Byte die Bits niedrigerer Ordnung (dies ist bekannt als Big-Endian ist; wenn Ihr Byte-Array Little-Endian-Daten enthalten sind, Sie würde das zweite Byte über statt für 16-Bit-Zahlen verschieben;. für Little-Endian 32-Bit-Zahlen, würden Sie die Reihenfolge aller 4 Bytes umkehren müssen, weil Java Integer Big-Endian Ordnung folgen)

einfache Art und Weise in Java ein Array von Bytes zu Bits zu analysieren ist JBBP Nutzung

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

wird der Code geparst Bits jedes Byte als 8 Bytes stellt in den Bits Array der syntaxanalysierten Klasseninstanz

Sie können zu einem short (2 Byte) umwandeln, indem logische oder-ing die beiden Bytes zusammen:

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

Ich schlage vor, Sie nehmen einen Blick auf Preon . In Preon, würden Sie in der Lage sein, so etwas zu sagen:

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

Die Ergebnisse ist ein Feld von Nullen und Einsen in dem 1=TRUE und 0=FALSE:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top