Bit-Stream

Status
Nicht offen für weitere Antworten.

thomas.g

Bekanntes Mitglied
Hi,

Ich schreibe gerade ein Tool welches dass auslesen von Informationen wie Frequenz, Framerate, ID3-Tags(bei MP3), Bitrate etc. in OGG bzw anderen Formaten ermöglicht.

Das geht auch, nur einige Formate haben mehr Tags (Header, Comment, ID3 etc).

Bei OGG Dateiformat ist zwischen Header und dem Comment Tag ein sogenanntes "framing_flag" Bit.

Wie kann man wenn ich einen FileInputStream habe genau nur ein Bit aus einem Stream auslesen?

thx, thomas
 

thomas.g

Bekanntes Mitglied
ok, mittlerweile weiß ich, dass ich zum Schluss jedes OGG Tags 1 Byte auslesen muss.

Diese Teilen sich aber so auf:

4 Bit = Integer
4 Bit = Integer

Ich habe auch herausgefunden, dass dies mit diesen logischen Operatoren in Java geht um Bits auszulesen.

Kennt sich wer mit diesen Shift "<<" bzw "|" und "&" in Java aus?

thx, thomas
 

thomas.g

Bekanntes Mitglied
So, für alle die keinen blassen schimmer davon haben.

Ich habe beim googlen eine Beschreibung der Shift-Operatoren in Java gefunden und mein Problem lösen können.

Die Lösung:

Code:
/**
     * Divides a bit and returns the 'left' result
     */
    public static int divideBitLeft(byte b) {
        return (int)(b & 0xFF) >> 4;
    }
    /**
     * Divides a bit and returns the 'right' result
     */
    public static int divideBitRight(byte b) {   
        int num = rotateLeft(b,4);
        return divideBitLeft((byte)num);
    }
  /**
   * Translates the right-n Bits to the left end
   */
    public static int rotateLeft(byte v, int n) {
        return (v << n) | (v >>> (32 - n));
    }


So, nehmen wir an, die Zahl (Binär) ist 1111 1100 --> ein Byte.

Um jetzt an die linken 1111 zu gelangen reicht die Methode divideBitLeft, welche nichts anderes macht, als die 1100 aus der Zahl raus zu verschieben. Die neue Zahl ist dann 0000 1111. Da aber Nullen am beginn einer Binärzahl nicht von Bedeutung sind, heißt die neue Zahl 1111 welches unser Ergebnis ist, was wir haben wollen.

Um jetzt auch noch die rechte Hälfte also 1100 zu bekommen, vertauschen wir die beiden Hälften mit der Methode rotateLeft. Die Zahl ist dann 1100 1111. Dannach wenden wir das gleiche Schema wie gerade oben beschrieben an.


Fazit: Das ganze ist etwas komplizierter aber gerade noch zu verstehen :wink:

mfg, thomas
 
G

Guest

Gast
Warum so umständlich, wenn du nur ein bestimmtes Bit prüfen willst?
Einfache Maskierung reicht vollkommen aus.
z.B. MSB eines Bytes prüfst du wie folgt.
Code:
byte b = ...

if( (b & 0x80) == 0x80 )
  MSB gesetzt
else
  MSB nicht gesetzt
 

byte

Top Contributor
Ein Bit maskieren heisst soviel wie nachschauen, ob das Bit gesetzt ist oder nicht. Gast hat ja schon ganz trefflich beschrieben, wie sowas funktioniert. Auf diese Weise kannst Du beliebige Bits prüfen, indem Du für 0x80 den entsprechenden Wert einsetzt.
 

thomas.g

Bekanntes Mitglied
Hi,

ich bräuchte nochmal eure Hilfe.

Diesmal geht es darum, dass ich 1 byte (8 bit) Daten habe und von diesen Daten nur 5 Bit brauche.

Also z.B.

7 6 5 4 3 2 1 0 --> Index
[ 0 0 0 1 0 1 0 0 ] --> 8 Bit Daten (1 byte)

Wie kann ich das machen, dass ich z.B. aus 8 bit Daten nur die 101 Binär also Dezimal 5 herausbekomme?

Ich habe bei einem Dateiformat nämlich das Problem dass ich 1 Byte Daten habe welches allerdings einen 5 bit und einen 3 bit integer beinhaltet.

Ich bräuchte einen Vorschlag für eine Methode die mir einen Integer von einem bestimmten Bereich (index) zurückliefert. Also dass ich sagen kann: "Hier hast du die 8-bit Daten und gibt mir davon einen Integer zwischen dem Index 2 und 4 zurück" --> bei meinem Beispiel oben sollte das Ergnis dann 101 also 5 sein!

thx, thomas
 

byte

Top Contributor
thomas.g hat gesagt.:
Also z.B.

7 6 5 4 3 2 1 0 --> Index
[ 0 0 0 1 0 1 0 0 ] --> 8 Bit Daten (1 byte)

Wie kann ich das machen, dass ich z.B. aus 8 bit Daten nur die 101 Binär also Dezimal 5 herausbekomme?

Ich habe bei einem Dateiformat nämlich das Problem dass ich 1 Byte Daten habe welches allerdings einen 5 bit und einen 3 bit integer beinhaltet.

In diesem Fall kannst Du 3 mal nach links shiften und 5 mal nach rechts. Auf diese Weise kannst Du Dir auch recht einfach eine Methode schreiben, die das variabel macht, also der du die Indizes mitgeben kannst.
 

thomas.g

Bekanntes Mitglied
gut, danke, das geht schon mal.

Jetzt gilt es noch zu lösen wie ich Integer die signed und welche die unsigned sind handhabe.

z.B.

[ 111 ] könnte 7 als auch -1 heißen.

Bei dem Dateiformat (Vorbis OGG) sind manche Tags signend und manche nicht. Wenn ich in Java Bytes zu Integer verwandle sind sie immer signed d.h. es würde immer -1 rauskommen.

Kann ich irgendwie sagen, dass Java diese 3 Bits in meinem Beispiel als 7 sieht und nicht als -1 ?

thx, thomas
 

thomas.g

Bekanntes Mitglied
aha, und wie würde das ganze dann aussehen wenn er bei [ 111 ] nicht 7 sondern -1 interpretieren soll? :bahnhof:

thx, thomas
 

byte

Top Contributor
Ich glaube, Du hast das mit den signed bytes noch nicht so ganz verstanden (oder ich verstehe nicht, was Du willst *g*). Also nochmal langsam: Bytes in Java sind immer signed. Das bedeutet, dass von den 8 Bit eins fürs Vorzeichen draufgeht. Möchte man nun aber doch mit unsigned bytes arbeiten, dann konvertiert man das Byte am besten in ein int.

(int) b & 0xFF bewirkt dabei, dass der int Wert im Zweifelsfall halt nicht negativ ist. Man hat also ein unsigned byte (jedoch als int). Ob man aber nun mit ints oder bytes rechnet, ist im Endeffekt wurscht, weil die Bitoperationen genauso auf ints funktionieren. Und intern wird eh binär gerechnet, weils schneller ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN SonarLint: Resources should be closed bei Stream<T>? Allgemeine Java-Themen 6
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
looparda Stream mit Sonderbehandlung des ersten Elements Allgemeine Java-Themen 17
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
M stream.Collectors Fehlermeldung Allgemeine Java-Themen 1
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
N Java stream filtern. Allgemeine Java-Themen 19
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
N javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Allgemeine Java-Themen 3
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
J Stream-basierter Cache Allgemeine Java-Themen 4
D IP-Cam live stream speichern Allgemeine Java-Themen 9
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
D Klassen Zeit aus NMEA-Stream in SimpleDateFormat Allgemeine Java-Themen 17
J Stream-Murks! Allgemeine Java-Themen 18
T Problem mit gzip Stream und Ende der Datei Allgemeine Java-Themen 2
JAVATUX Java Programm mit ATI Stream Unterstützung Allgemeine Java-Themen 3
X Audio Internet-Stream Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
C Bit Stream Klasse Allgemeine Java-Themen 9
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
M PCL Stream lesen und schreiben Allgemeine Java-Themen 6
musiKk Stream zum Lesen von Dateien mit seek und peek Allgemeine Java-Themen 2
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
O Stream unvollständig Allgemeine Java-Themen 3
0 Stream/Datei an VLC übergeben und abspielen Allgemeine Java-Themen 10
B getImage() vom Stream oder File Allgemeine Java-Themen 3
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
D FileInputStream bzw. BufferedInput Stream Puffern Allgemeine Java-Themen 6
G Live-Stream einer WebCam importieren Allgemeine Java-Themen 3
T Mehrere Dateien byteweise durch stream schieben Allgemeine Java-Themen 9
T Stream encodierrn und decodieren mit JSpeex Allgemeine Java-Themen 2
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
O Input stream geht net Allgemeine Java-Themen 2
N Speichern von binären Dateien (Zip-Archiv) per Stream? Allgemeine Java-Themen 6
R Stream für alle Dateiarten Allgemeine Java-Themen 9
thE_29 API für transport stream Allgemeine Java-Themen 2
M Output Stream / Protokoll does not support output Allgemeine Java-Themen 2
D GetResourceAsStream - Stream closed exception Allgemeine Java-Themen 5
G Umwandlung in Stream Allgemeine Java-Themen 5
J Output Stream Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben