Comment puis-je obtenir un octet qui représente un entier non signé en Java?
-
27-10-2019 - |
Question
J'ai des nombres entiers de 0 à 255, et je dois les transmettre à un OutputStream codé sous forme d'octets non signés. J'ai essayé de convertir à l'aide d'un masque comme, mais si i = 1, l'autre extrémité de mon flux (un périphérique série uint8_t attendant) pense que je l'ai envoyé un entier non signé = 6.
OutputStream out;
public void writeToStream(int i) throws Exception {
out.write(((byte)(i & 0xff)));
}
Je parle à un Arduino à /dev/ttyUSB0
en utilisant Ubuntu si cela rend les choses plus ou moins intéressantes.
Voici le code Arduino:
uint8_t nextByte() {
while(1) {
if(Serial.available() > 0) {
uint8_t b = Serial.read();
return b;
}
}
}
J'ai aussi un code Python qui fonctionne très bien avec le code Arduino et l'Arduino REÇOIT heureusement le nombre entier correct si j'utilise ce code en 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]))
Je voudrais aussi par la suite, comme de le faire à Scala, mais je retombe à Java pour éviter la complexité alors que je résoudre ce problème.
La solution
Cast, puis le masque: ((byte)(i)&0xff)
Mais, quelque chose est très étrange depuis:
(dec) 8 - (binaire) 1000
(Dec) 6 - (binaire) 0110
[modifier]
Comment est votre Arduino recevoir 6 (binaire) 0110 lorsque vous envoyez 1 (binaire) 0001
[/ Edit]
Autres conseils
Je pense que vous voulez juste out.write(i)
ici. Seuls les huit bits de poids faible sont écrits à partir de l'argument int i
.