Arbeiten mit einem Bitarray

D

Der_AltMann

Mitglied
mich würde interessieren wie ich am einfachsten eine beliebige Bitkette erstellen kann.
Anforderungen:

- ich habe verschiedene Zahlen mit einer gegebenen Länge(diese Länge kann länger sein als die eigentliche Zahl in Bits)
- ich möchte diese Zahlen nacheinander in ein Datentyp bringen
- Am Ende soll es dann in einem Byte Array sein

Beispiel:
Zahl1 : 5 Länge 6
Zahl 2: 0 Länge 3
Zahl 3: 10 Länge 4

Ergebnis sollte dann so sein(Trennstriche nur zur Übersichtlichkeit):
000101|000|1010|

Im Byte Array würde das dann so aussehen wenn ich mich nicht irre:
00010100|01010000

Dies soll mit beliebig vielen Zahlen funktionieren
 
sascha-sphw

sascha-sphw

Bekanntes Mitglied
Ich verstehe nicht ganz was Du vorhast, aber Du weißt schon, das alle Daten Bitmuster im Speicher sind?

Also jede Zahl ist bereits ein Bitmuster.
 
D

Der_AltMann

Mitglied
Ich verstehe nicht ganz was Du vorhast, aber Du weißt schon, das alle Daten Bitmuster im Speicher sind?

Also jede Zahl ist bereits ein Bitmuster.
ja das ist mir bewusst. Ich arbeite mit nativem Code und die Hardware, die ich anspreche, möchte ein Byte Array, das sie dann interpretiert und wieder in die Zahlen zurückrechnet. Das wichtige ist eben, dass die Bits an der richtigen Stelle stehen und eben manche über die Grenze eines Bytes hinaus in dem Array abzulegen sind
 
sascha-sphw

sascha-sphw

Bekanntes Mitglied
ich habe verschiedene Zahlen mit einer gegebenen Länge(diese Länge kann länger sein als die eigentliche Zahl in Bits)
Was ist die Länge einer Zahl? Meinst Du die Anzahl der Binärstellen?
Das Bitmuster einer 5 als byte ist 0b00000101 und wenn Du die führenden Nullen nicht zählst wäre das die länge 3 und nicht 6

Das wäre dann so:
Java:
Integer value = 5;
byte[] bytes = new byte[3];
bytes[0] = value.byteValue();
...

das sie dann interpretiert und wieder in die Zahlen zurückrechnet.
Hier verstehe ich nicht wie die Hardware das Byte Array interpretiert.

Das wichtige ist eben, dass die Bits an der richtigen Stelle stehen
Das gilt ja Grundsätzlich.

und eben manche über die Grenze eines Bytes hinaus in dem Array abzulegen sind
Soll heißen, Du willst dann aus einer Zahl 2 Bytes im Array machen? Also so:
Code:
z.B. 256
[
    0b00000000,
    0b00000001
]
oder
[
    0b00000001,
    0b00000000
]
 
D

Der_AltMann

Mitglied
Was ist die Länge einer Zahl? Meinst Du die Anzahl der Binärstellen?
Das Bitmuster einer 5 als byte ist 0b00000101 und wenn Du die führenden Nullen nicht zählst wäre das die länge 3 und nicht 6

Das wäre dann so:
Java:
Integer value = 5;
byte[] bytes = new byte[3];
bytes[0] = value.byteValue();
...


Hier verstehe ich nicht wie die Hardware das Byte Array interpretiert.


Das gilt ja Grundsätzlich.


Soll heißen, Du willst dann aus einer Zahl 2 Bytes im Array machen? Also so:
Code:
z.B. 256
[
    0b00000000,
    0b00000001
]
oder
[
    0b00000001,
    0b00000000
]
Gegeben ist die Zahl und die Länge. Mit Länge meine ich die Bits im Array. Mir ist bewusst, dass 5 nur 3 Stellen hat und nicht 6. Aber da die Hardware mir auch größere Zahlen zurückgeben kann sind die 3 nullen davor wichtig. Die Hardware weiß auch wie viele Bits die Zahlen belegen und kann sie deshalb extrahieren.
 
sascha-sphw

sascha-sphw

Bekanntes Mitglied
Ahh OK. Jetzt denke habe ich es begriffen.

Mit Bitoperatoren könntest Du das versuchen. Sowas wie
Java:
Integer value1 = 5;
Integer value2 = 0;
        
Integer firstbyte = 0b11111100 & (value1 << 2) | 0b00000011 & (value2 >> 1);
        
System.out.println(Integer.toBinaryString(firstbyte));
 
W

White_Fox

Top Contributor
Kann es sein, daß du die ByteBuffer-Klasse suchtst?

Java:
ByteBuffer buffer = ByteBuffer.allocate(4);        //ByteBuffer mit Platz für vier Bytes
buffer.putInt(999);                                //Schiebe ein Integer in den ByteBuffer
byte[] bytearray = buffer.array();                 //Hole das Bytearray

Edit:
Die ByteBuffer-Klasse ist für Byteschubserei recht hilfreich, aber du kannst damit nur ganze Bytes bearbeiten. Mit einzelnen Bits wird das schwierig.

Aber magst du vielleicht noch etwas zu deiner Verwendung schreiben? Zahlen mit verschiedener Länge speichern zu wollen erscheint mir reichlich seltsam. Selbst wenn ich berücksichtige, daß am anderen Ende der Leitung eine deutlich schmalere Hardware werkelt, mutet das sehr komisch an.
 
H

httpdigest

Top Contributor
@Der_AltMann eine einfache aber relativ suboptimale Implementierung wäre:
Java:
public class BitWriter {
  private byte[] buf = new byte[32];
  private int nbits;
  public BitWriter write(int v, int n) {
    while (n --> 0) {
      int b = nbits >>> 3;
      if (buf.length - 1 < b)
        buf = java.util.Arrays.copyOf(buf, buf.length << 1);
      buf[b] |= (v & 1) << (nbits++ & 7);
      v >>>= 1;
    }
    return this;
  }
  public byte[] toArray() {
    return java.util.Arrays.copyOfRange(buf, 0, (nbits + ((8 - nbits) & 7) >>> 3));
  }

  // Test
  public static void main(String[] args) {
    byte[] arr = new BitWriter()
        .write(5, 6)  // <- 5 der Länge 6 Bits
        .write(0, 3)  // <- 0 der Länge 3 Bits
        .write(10, 4) // <- 10 der Länge 4 Bits
        .toArray();
    for (byte b : arr) {
      System.out.println(
          String.format("%8s",
              Integer.toBinaryString(b)).replace(' ', '0'));
    }
  }
}
 
H

httpdigest

Top Contributor
Noch ein bisschen aufgeräumt und ein paar Optimierungen eingebaut: keine Bits mehr schreiben, wenn sowieso alle 0; sowie "byte-weises" Schreiben von Bitfolgen:
Java:
public class BitWriter {
  private byte[] buf;
  private int nbits;

  // API
  public BitWriter() {
    this(8);
  }
  public BitWriter(int nbytes) {
    buf = new byte[nbytes];
  }
  public BitWriter write(int v, int n) {
    for (int r; v != 0 && n > 0; v >>>= r, nbits += r, n -= r) {
      r = Math.min(n, 8 - (nbits & 7));
      int b = nbits >>> 3;
      if (buf.length - 1 < b)
        buf = java.util.Arrays.copyOf(buf, Math.max(b + 1, buf.length << 1));
      buf[b] |= (v & (1 << r) - 1) << (nbits & 7);
    }
    nbits += n;
    return this;
  }
  public BitWriter clear() {
    java.util.Arrays.fill(buf, 0, touchedBytes(), (byte) 0);
    nbits = 0;
    return this;
  }
  public byte[] toArray() {
    return java.util.Arrays.copyOfRange(buf, 0, touchedBytes());
  }

  // internal
  private int touchedBytes() {
    return nbits + (8 - nbits & 7) >>> 3;
  }
}
 
Zuletzt bearbeitet:
D

Der_AltMann

Mitglied
Vielen Dank für die Hilfe. Ich hab selber eine Lösung gefunden:
Java:
String tmpByteArray = "";
//for schleife die alle Zahlen added
tmpByteArray += convertToString(numberOfBits,integer);
byte [] message = new BigInteger(tmpByteArray, 2).toByteArray();


    public String convertToString(int numberOfBits, int integer) {
        if (numberOfBits > 0) { // To prevent FormatFlagsConversionMismatchException.

            String nBits = String.format("%" + numberOfBits + "s", // Int to bits conversion
                    Integer.toBinaryString(integer)).replaceAll(" ", "0");

            return nBits;
        }
        System.out.println("Error in converting message for slave");
        return null;

    }
 
D

Der_AltMann

Mitglied
Kann es sein, daß du die ByteBuffer-Klasse suchtst?

Java:
ByteBuffer buffer = ByteBuffer.allocate(4);        //ByteBuffer mit Platz für vier Bytes
buffer.putInt(999);                                //Schiebe ein Integer in den ByteBuffer
byte[] bytearray = buffer.array();                 //Hole das Bytearray

Edit:
Die ByteBuffer-Klasse ist für Byteschubserei recht hilfreich, aber du kannst damit nur ganze Bytes bearbeiten. Mit einzelnen Bits wird das schwierig.

Aber magst du vielleicht noch etwas zu deiner Verwendung schreiben? Zahlen mit verschiedener Länge speichern zu wollen erscheint mir reichlich seltsam. Selbst wenn ich berücksichtige, daß am anderen Ende der Leitung eine deutlich schmalere Hardware werkelt, mutet das sehr komisch an.
Ich arbeite mit einem Lin-Bus. Dort bin ich der Master und sende die Frames an die Slaves. Ein Frame besteht aus einem Header, der Id,Checksumme,.. und ein DatenByte Array enthällt. Das DatenByte Array muss ich eben befüllen mit Informationen. Über eine Konfigurations File, die Hardwareabhängig ist, ist definiert, welche Bits welche Informationen enthalten müssen.
Ich hoffe das ist verständlich 😄 sonst einfach nochmal nachfragen
 
H

httpdigest

Top Contributor
Vielen Dank für die Hilfe. Ich hab selber eine Lösung gefunden:
Java:
String tmpByteArray = "";
//for schleife die alle Zahlen added
tmpByteArray += convertToString(numberOfBits,integer);
byte [] message = new BigInteger(tmpByteArray, 2).toByteArray();


    public String convertToString(int numberOfBits, int integer) {
        if (numberOfBits > 0) { // To prevent FormatFlagsConversionMismatchException.

            String nBits = String.format("%" + numberOfBits + "s", // Int to bits conversion
                    Integer.toBinaryString(integer)).replaceAll(" ", "0");

            return nBits;
        }
        System.out.println("Error in converting message for slave");
        return null;

    }
Oh wow... wofür Leute heutzutage alles Strings missbrauchen. Du schreibst jetzt nicht wirklich eine Zahl per String.format() und Integer.toBinaryString(), konkatenierst das dann als Strings und parsed den gegebenen Binärstring wieder mit BigInteger... :)
 
D

Der_AltMann

Mitglied
Oh wow... wofür Leute heutzutage alles Strings missbrauchen. Du schreibst jetzt nicht wirklich eine Zahl per String.format() und Integer.toBinaryString(), konkatenierst das dann als Strings und parsed den gegebenen Binärstring wieder mit BigInteger... :)
Das hat als erstes Funktioniert bei mir xD
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Eclipse Gemeinsam mit NetBeans an einem Projekt arbeiten? Allgemeine Java-Themen 3
J Arbeiten mit Punkten in einem JPanel Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
E mit extrem langen Zahlen (als Zeichneketten) arbeiten Allgemeine Java-Themen 4
F Input/Output Arbeiten mit dem JFileChooser Allgemeine Java-Themen 4
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
P [Thread] Scheint nicht Sequenziell zu Arbeiten Allgemeine Java-Themen 9
G Wie kann man sehen, welche Applikationen mit java arbeiten? Allgemeine Java-Themen 17
nrg Arbeiten mit sehr großen CSV Dateien Allgemeine Java-Themen 20
S Schnelles arbeiten mit großen CSV Dateien Allgemeine Java-Themen 4
J Mit mehrdimensionalen Integer-Arrays arbeiten Allgemeine Java-Themen 17
V Java-Programm nur "mit halber Kraft" arbeiten lass Allgemeine Java-Themen 11
J Methode nur max 1sec arbeiten lassen Allgemeine Java-Themen 2
C Strings zu groß um damit zu arbeiten Allgemeine Java-Themen 31
M Wie bekomme ich Threadsdazu parallel zu arbeiten? Allgemeine Java-Themen 13
B Arbeiten mit Dateien Allgemeine Java-Themen 2
D Fehlerhafte Thread Verwendung beim arbeiten mit Sockets Allgemeine Java-Themen 6
W Mit Date-Objekten arbeiten Allgemeine Java-Themen 10
M Mit Textdateien arbeiten Allgemeine Java-Themen 5
pkm Warnungen in einem Drools-Projekt unterdrücken? Allgemeine Java-Themen 1
D Union in einem Struct in JNA Allgemeine Java-Themen 5
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
R Zoom In einem grid Allgemeine Java-Themen 0
M java.io.EOFException bei einem DataoutputStream ?! Allgemeine Java-Themen 2
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Fahrtsimulation von einem Zug Allgemeine Java-Themen 0
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
K Bild in einem anderen Bild suchen Allgemeine Java-Themen 12
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
R Farbe zu einem Eckpunkt generieren Allgemeine Java-Themen 0
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
X Punkte in einem Feld bestimmen Allgemeine Java-Themen 22
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
Sin137 OOP Auf JPanel zugreifen, das einem JTabbePane hinzugefügt worden ist Allgemeine Java-Themen 10
E Die if-Anweisung in einer Java Bean bzw. in einem Servlet? Allgemeine Java-Themen 8
0 Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
H Klammerberechnungen bei einem Taschenrechner Allgemeine Java-Themen 2
S Kann man mit einem GeneralPath.curveTo ein GeneralPath.quadTo ersetzen..? Allgemeine Java-Themen 2
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
M Zeilen zu einem DefaultTableModel hinzufügen Allgemeine Java-Themen 1
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
Thallius PDF von einem BufferedImage erstellen Allgemeine Java-Themen 1
M Abonnentenzahl, Aufrufe, etc. von einem YouTube-Kanal anzeigen Allgemeine Java-Themen 7
B Fehler bei einem Programm Allgemeine Java-Themen 10
E am häufigsten vorkommenden Farben aus einem Bild Allgemeine Java-Themen 5
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
F Punkte in einem Bild finden Allgemeine Java-Themen 10
M Eclipse Eine xhtml aus einem JSF Projekt starten Allgemeine Java-Themen 2
M String an einem abschnitt ändern Allgemeine Java-Themen 14
I Zu zweit an einem Projekt? Allgemeine Java-Themen 1
S Methoden Stunden seit einem bestimmten Zeitpunkt Allgemeine Java-Themen 3
D Problem mit Login in einem Dynamischen Webprojekt Allgemeine Java-Themen 1
D Grafisches Frontend zu einem Java Prozess erstellen Allgemeine Java-Themen 0
S Panel zur Dateiendarstellung wie in einem Explorer Allgemeine Java-Themen 12
K Code zu einem Projekt entschluesseln Allgemeine Java-Themen 15
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
M Lichteffekte in einem Java-Spiel Allgemeine Java-Themen 4
A Auswahl eines JEditorPane das Sich in einem JScrollPanel Befindet Allgemeine Java-Themen 2
S Android: Verlinkung in einem TextView Allgemeine Java-Themen 3
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
F Funktion nur in einem Zeitraum Allgemeine Java-Themen 5
L Klassen Polymorphie:2 Attribute gleichen Namens in einem Objekt Allgemeine Java-Themen 6
J Datentypen Verständnisprobleme bei einem Quelltext Allgemeine Java-Themen 32
I Sound abspielen aus einem Sample-Array Allgemeine Java-Themen 2
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
D IP / Domain in einem String erkennen Allgemeine Java-Themen 2
SexyPenny90 Spalte einer Exceldatei in einem String speichern Allgemeine Java-Themen 11
K Quadrat in einem Bild erkennen Allgemeine Java-Themen 33
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9

Ähnliche Java Themen

Anzeige

Neue Themen


Oben