java无符号字节到流

java无符号字节到流,java,stream,Java,Stream,我正在制作一个使用串口的应用程序。问题是,我控制的设备接收无符号字节范围,正如我看到的,java只接受有符号字节范围 我在谷歌上搜索过如何发送,但我只知道如何接收未签名字节 谢谢 编辑2:@durandal向我的代码建议的修复程序,以接收: public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.DATA_A

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

我在谷歌上搜索过如何发送,但我只知道如何接收未签名字节

谢谢 编辑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;
        }

一个字节只有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

一个字节只有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

你把事情弄得太复杂了。一个字节就是一个字节,没有符号/无符号字节,只有字节。字节有符号/无符号解释,但这是一个完全不同的概念

如果接收到的代码被破坏,它将在接收到字节值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”声明为byte(它应该是int,您绝对需要read()的返回值作为int!),并在检查-1值之前将input.read()转换为byte。相反,当您将int放入数组中时,应该将其强制转换为int,而不是for。

您让事情变得过于复杂,而不是一无所有。一个字节就是一个字节,没有符号/无符号字节,只有字节。字节有符号/无符号解释,但这是一个完全不同的概念

如果接收到的代码被破坏,它将在接收到字节值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”声明为byte(它应该是int,您绝对需要read()的返回值作为int!),并在检查-1值之前将input.read()转换为byte。相反,在将int放入数组而不是for时,应该强制转换它。

尝试按照进行转换,然后发送得到的值。可以将有符号字节视为无符号字节,反之亦然。这只是一个小心的问题。@Song我试过你说的,我在第一篇文章中放了一个代码,我用它来测试接收器,我收到了00。Thanks@LouisWasserman怎样Thanks@soong谢谢,按照进行转换,然后发送您得到的值。您可以将有符号字节视为无符号字节,反之亦然。这只是一个小心的问题。@Song我试过你说的,我在第一篇文章中放了一个代码,我用它来测试接收器,我收到了00。Thanks@LouisWasserman怎样Thanks@soong谢谢,我已经修改了你说的部分,但是我继续收到00@Cako从你的评论来看,我想你在让它按预期工作方面仍然存在问题,但从问题的范围来看,我无法猜测问题可能是什么。我认为您应该看到TestOhex()works提供的正确十六进制值。。。也许可以延伸一点,看看还有什么问题?没问题。我想要的部分是有效的,另一部分无关紧要。无论如何,我感谢你的帮助我已经修改了你说的部分,但我继续收到00@Cako从你的评论来看,我想你在让它按预期工作方面仍然存在问题,但从问题的范围来看,我无法猜测问题可能是什么。我认为您应该看到TestOhex()works提供的正确十六进制值。。。也许可以延伸一点,看看还有什么问题?没问题。我想要的部分是有效的,另一部分无关紧要。无论如何,我感谢你的帮助