2016-11-27 6 views
0

Ich versuche, mpegts Präsentationszeitstempel zu erstellen. Es ist 5 Bytes lang. Ich habe eine Lösung im Quellcode des VLC-Players gefunden. Es sieht so aus (in C lang Code):Wie kann ich Bits in Byte-Array in Java schreiben?

bits_write(&bits, 4, i_pts_dts); // '0010' or '0011' 
bits_write(&bits, 3, i_pts >> 30); 
bits_write(&bits, 1, 0x01); // marker 
bits_write(&bits, 15, i_pts >> 15); 
bits_write(&bits, 1, 0x01); // marker 
bits_write(&bits, 15, i_pts); 
bits_write(&bits, 1, 0x01); // marker 
i_header_size -= 0x5; 

Das bedeutet, ich muss 5 Bytes von 40 Bits sammeln. Zum Beispiel muss ich 5 Bytes von 2350 Dezimalzahl. Binary Ansicht:

Nach VLC Manipulation Ich muss diese binäre Sicht haben:

0010 000 1 000000000000000 1 000100100101110 1 

Hex Ansicht:

21 00 01 12 5D 

Wie kann ich es tun in Java?

Auch ich habe Java-Lösung auf GitHub gefunden: https://github.com/taktod/myLib/blob/master/myLib.MIT/myLib.container.mpegts/src/main/java/com/ttProject/container/mpegts/field/PtsField.java Aber diese Erkenntnis ist zu schwierig. Für einen einmaligen Betrieb ist es notwendig, zu viele Hilfsklassen wie Bit1 zu erstellen, Bit2, Bit3, etc ...

+0

Sie bestimmen, wie Sie Ihre Eingabe Karte Bits um Bytes auszugeben, z schreibe es auf Papier und benutze dann [Java-Bitmanipulationsoperatoren] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html), um dieses Ergebnis zu erstellen. – Andreas

+0

@Andreas, ich weiß über Bit-Manipulationsoperatoren. Zum Beispiel kann ich 40 Bits in String verarbeiten und nach der Konvertierung in long, aber lang hat 4 Bytes Größe. Double hat 8 Bytes. Aber ich brauche 5 Bytes. Ich habe keine Ahnung, wie ich das machen kann. – Virkom

Antwort

0

Diese einfache Bit-Manipulation ist:

int dts = 2;  // must be 2 or 3 
long pts = 2350; // must be less than 8,589,934,592 

byte[] output = new byte[] { 
     (byte) (dts << 4 | pts >> 30 | 1), 
     (byte) (pts >> 22), 
     (byte) (pts >> 15 | 1), 
     (byte) (pts >> 7), 
     (byte) (pts << 1 | 1) 
}; 
for (byte b : output) 
    System.out.printf("%02x ", b); // prints: 21 00 01 12 5d 
+0

Oh schön, danke. – Virkom

Verwandte Themen