Wie kann ich ein Byte bekommen, das eine nicht signierte INT in Java darstellt?
-
27-10-2019 - |
Frage
Ich habe Ganzzahlen von 0 bis 255 und muss sie an einen als nicht signierten Bytes codierten Output -Stream weitergeben. Ich habe versucht, eine Maske wie so zu konvertieren, aber wenn ich = 1, der andere Ende meines Streams (ein serielles Gerät, das uint8_t erwartet), denkt, ich habe eine unsignierte Ganzzahl gesendet = 6.
OutputStream out;
public void writeToStream(int i) throws Exception {
out.write(((byte)(i & 0xff)));
}
Ich spreche mit einem Arduino bei /dev/ttyUSB0
Verwenden von Ubuntu, wenn dies die Dinge mehr oder weniger interessant macht.
Hier ist der Arduino -Code:
uint8_t nextByte() {
while(1) {
if(Serial.available() > 0) {
uint8_t b = Serial.read();
return b;
}
}
}
Ich habe auch einen Python -Code, der mit dem Arduino -Code hervorragend funktioniert, und der Arduino empfängt glücklich die richtige Ganzzahl, wenn ich diesen Code in Python verwende:
class writerThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
while True:
input = raw_input("[W}Give Me Input!")
if (input == "exit"):
exit("Goodbye");
print ("[W]You input %s\n" % input.strip())
fval = [ int(input.strip()) ]
ser.write("".join([chr(x) for x in fval]))
Ich würde dies auch in Scala auch gerne tun, aber ich fällt zurück zu Java, um die Komplexität zu vermeiden, während ich dieses Problem löste.
Lösung
Werfen, dann maskieren: ((byte)(i)&0xff)
Aber etwas ist sehr seltsam, da:
(Dez) 8 - (binär) 1000
(Dez) 6 - (binär) 0110
bearbeiten
Wie erhält Ihr Arduino 6 (binär) 0110, wenn Sie 1 (binär) 0001 senden?
/bearbeiten
Andere Tipps
Ich denke du willst nur out.write(i)
hier. Nur die acht Bit mit niedriger Ordnung sind aus dem Int-Argument geschrieben i
.