BitSet

Guten Tag

von meine Roboter aus schicke ich Bits in Form eines Bytes. Der Roboter kennt aber die Vorzeichen nicht beim Byte, das heisst er schickt bei acht bit einen Wert von 0 - 255.

Im Java Programm möchte ich diese in ein BitSet kopieren, was mir jedoch einen Fehler gibt, weil Java nur -128 - 127 kennt…

Kann ich in Java das Vorzeichen irgendwie umgehen?

Kann ich in Java das Vorzeichen irgendwie umgehen?

Benutze in Java den nächst größeren Typ. Das wäre dann ein short.

Der Short funktioniert nicht in der Kombination mit dem BitSet

Zum wandeln von Bis in Int und umgekehrt:


import java.util.BitSet;

public class BitOperations {

    public static int bitsToInt(BitSet bits) {
        int value = 0;
        for (int i = bits.size() - 1; i >= 0; i--) {
            if (bits.get(i)) {
                value = value | 1;
            }
            if (i > 0) {
                value = value << 1;
            }
        }
        return value;
    }

    public static BitSet intToBits(int value) {
        final BitSet bits = new BitSet(Integer.SIZE);
        int index = 0;
        while (value != 0L) {
            if (value % 2 != 0) {
                bits.set(index);
            }
            ++index;
            value = value >> 1;
        }
        return bits;
    }
}

Falls wandeln eines List in String (auch Probleme wegen signed:

List<Byte> data;
String str = new String();
for (final byte b : data) {
    str += (char) (b & 0xff);
}```

Und für die Konvertierung von byte[] zu BitSet:
http://www.exampledepot.8waytrips.com/egs/java.util/Bits2Array.html

Dem BitSet ist es übrigens egal, ob du Vorzeichen hast oder nicht und wie groß der Wertebereich ist, an sich ist das nichts anderes als ein großes Array aus boolean-Werten.

Gruß

Okey ich nehm den Umweg von kappesf Danke vielmals.

@Firephoenix , seit Java 1.7 gibt es BitSet.valueOF(byte[] oder long[]) und es gibt BitSet.toArray. Deine Bespiele breucht es also nicht mehr.

Vielen Dank trotzdem

Oh :o

Ich glaube in 1.7 habe ich mit der Klasse noch nicht gearbeitet, Danke für den Hinweis.

Gruß

Kein problem, dafür sind wir hier :slight_smile:

Kennst Du also schon, wollte gerade darüber schreiben. Aber dann verstehe ich das byte-Problem (negative Zahlen) nicht. Folgender Code funktioniert bei mir problemlos:

  public static void main(String[] args) {
    byte[] bits = { -1 };
    BitSet bs = BitSet.valueOf(bits);
    for (int i = 0; i < Byte.SIZE; i++) {
      System.out.println(i +"="+  bs.get(i));
    }
  }

Ich probiere es mit meiner Lösung zu erklären. Mein Roboter hat den maximalen byte Wert bei 255, da er vorzeichen nicht kennt.

Ein byte in java jedoch, hat nur -128 - 127 als wert, und wirf deshalb eine Exception wenn der Wert über 128 geht.

So, nun hab ich dem Roboter beigebracht das ein byte ein Vorzeichen hat :slight_smile:

	IF (temp_i5 >= 128) THEN
		 $send_data_pan[0] = $ENCODE(/L,(temp_i5-256))+";"
	ELSE
		$send_data_pan[0] = $ENCODE(/L,temp_i5)+";"
	END```

Falls der Wert 128 übersteigt, subtrahiere ich davon 256 und die Geschichte passt perfekt:-)

Ein byte in java jedoch, hat nur -128 - 127 als wert, und wirf deshalb eine Exception wenn der Wert über 128 geht.

Japp und genau die Stelle hab ich nicht verstanden. Man kann einem BitSet bytes mit negativen Werten übergeben und es wird keine Exception geworfen. Es ist also völlig egal, ob ein byte mit allen bits=1 von einem Java nun als negative eins oder von Deinem Robot als 255 interpretiert wird. Im Bitset wird das ganze eh nicht mehr als Nummer sondern eben als Folge von (nicht) gesetzten Bits interpretiert. Wo geht hier irgend ein Wert über 128 und führt zum Werfen einer Exception? Wir können das aber auch gerne hier abbrechen. Immerhin, hast du ja wohl bereits eine funktionierende Lösung gefunden. Da will ich auch nicht unnötig weiter nachbohren…

Jap aber du kannst mit BitSet keine Strings konvertieren. Deshalb gehe ich über ein Byte Array dass ich nachher das Byte Array einfach dem BitSet übergeben kann.

Und dort hängt es.