¿Cómo puedo obtener un byte que represente un int sin firmar en Java?
-
27-10-2019 - |
Pregunta
Tengo enteros de 0 a 255, y necesito pasarlos a una salida de salida codificada como bytes sin firmar. He tratado de convertir usando una máscara como así, pero si i = 1, el otro extremo de mi transmisión (un dispositivo serie que espera UINT8_T) cree que he enviado un entero sin firmar = 6.
OutputStream out;
public void writeToStream(int i) throws Exception {
out.write(((byte)(i & 0xff)));
}
Estoy hablando con un arduino en /dev/ttyUSB0
Usar ubuntu si esto hace las cosas más o menos interesantes.
Aquí está el código Arduino:
uint8_t nextByte() {
while(1) {
if(Serial.available() > 0) {
uint8_t b = Serial.read();
return b;
}
}
}
También tengo algún código de Python que funcione muy bien con el código Arduino, y el Arduino recibe felizmente el entero correcto si uso este código 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]))
También me gustaría hacer esto en Scala, pero me estoy volviendo a caer a Java para evitar la complejidad mientras resuelvo este problema.
Solución
Elenco, luego enmascarar: ((byte)(i)&0xff)
Pero, algo es muy extraño desde:
(dic) 8 - (binario) 1000
(dic) 6 - (binario) 0110
editar
¿Cómo recibe su Arduino 6 (binario) 0110 cuando envía 1 (binario) 0001?
/editar
Otros consejos
Creo que solo quieres out.write(i)
aquí. Solo los ocho bits de bajo orden se escriben a partir del argumento INT i
.