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?
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);
}```
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.
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
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.