java unsigned byte to stream

时间:2015-03-18 19:52:47

标签: java stream

我正在制作一个适用于串口的应用程序。问题是我控制的设备接收无符号字节范围,因为我看到java只接受有符号字节范围。

我已经用Google搜索了如何发送,但我只知道如何接收无符号字节。

由于 编辑2:由@durandal提议修复我的代码以接收:

 public void serialEvent(SerialPortEvent event) {
        switch (event.getEventType()) {
            case SerialPortEvent.DATA_AVAILABLE: {
                System.out.println("Datos disponibles");
                try {
                    int b;
                int disponibles = input.available();
                byte[] rawData = new byte[disponibles];
                int count = 0;
                while ((b = input.read()) != -1) {
                    if (count == disponibles - 1) {
                        break;
                    }
                    rawData[count] = (byte) b;
                    count++;

                    }
                    serial.serialDataReceived(bytesToHex(rawData), rawData);
                } catch (IOException ex) {
                    Logger.getLogger(PuertoSerie.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            break;
        }

2 个答案:

答案 0 :(得分:4)

一个字节只有8位。 Java假定默认情况下已签名,但如果您愿意,可以将其视为未签名。处理此问题的常用方法是使用可存储0到255的int值。

// from unsigned byte
byte[] bytes = ...
int value = 255;
bytes[0] = (byte) value;

// to unsigned byte
int value2 = bytes[0] & 0xFF;
// value2 == 255

答案 1 :(得分:1)

你在 nothing 上让事情过于复杂。一个字节是一个字节,没有有符号/无符号字节,只有字节。有一个字节的签名/无符号解释,但这是一个完全不同的概念。

您收到的代码已损坏,它会在收到字节值0xFF时停止读取,将其视为流末尾:

                byte b;
                int disponibles = input.available();
                byte[] rawData = new byte[disponibles];
                int count = 0;
                while ((b = (byte) input.read()) != -1) {
                    if (count == disponibles - 1) {
                        break;
                    }
                    rawData[count] = b;
                    count++;
                }

问题是声明“b”为字节(它应该是int,你绝对需要read()的返回值作为int!)和input.read()的转换为byte 之前检查-1值。当你把它放入数组时,你应该转换为int,而不是for。