Come posso ottenere un byte che rappresenta un int senza segno in Java?
-
27-10-2019 - |
Domanda
Ho numeri interi da 0 a 255 e ho bisogno di passarli a un outputstream codificato come byte non firmati. Ho provato a convertire usando una maschera come così, ma se i = 1, l'altra estremità del mio flusso (un dispositivo seriale in attesa di Uint8_t) pensa di aver inviato un numero intero non firmato = 6.
OutputStream out;
public void writeToStream(int i) throws Exception {
out.write(((byte)(i & 0xff)));
}
Sto parlando con un Arduino a /dev/ttyUSB0
Usando Ubuntu se questo rende le cose più o meno interessanti.
Ecco il codice Arduino:
uint8_t nextByte() {
while(1) {
if(Serial.available() > 0) {
uint8_t b = Serial.read();
return b;
}
}
}
Ho anche del codice Python che funziona alla grande con il codice Arduino e l'Arduino riceve felicemente il numero intero corretto se utilizzo questo codice in Python:
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]))
Alla fine mi piacerebbe anche farlo a Scala, ma sto tornando a Java per evitare la complessità mentre risolvo questo problema.
Soluzione
Cast, poi maschera: ((byte)(i)&0xff)
Ma da allora qualcosa è molto strano:
(dec) 8 - (binario) 1000
(dec) 6 - (binario) 0110
modificare
In che modo il tuo Arduino riceve 6 (binario) 0110 quando invii 1 (binario) 0001?
/modificare
Altri suggerimenti
Penso che tu voglia solo out.write(i)
qui. Solo gli otto bit di basso ordine sono scritti dall'argomento int i
.