【问题标题】:java unsigned byte to streamjava无符号字节流
【发布时间】:2015-03-18 19:52:46
【问题描述】:

我正在制作一个适用于串行端口的应用程序。问题是我正在控制的设备接收无符号字节范围,正如我所见,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;
        }

【问题讨论】:

  • 尝试按照stackoverflow.com/questions/7401550/…进行转换,然后发送你得到的值。
  • 您可以将有符号字节视为无符号字节,反之亦然。这只是一个小心的问题。
  • @soong 我已经尝试了你所说的我在第一篇文章中输入了一个用于测试接收的代码,我收到了 00。谢谢
  • @LouisWasserman 怎么样?谢谢
  • @soong 谢谢它的工作

标签: java stream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    你接收的代码坏了,当它收到字节值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() 到字节 before 的转换 检查 -1 值。你应该在将 int 放入数组而不是 for 时转换它。

    【讨论】:

    • 我已经修改了你说的部分,但我继续收到00
    • @Cako 从您的评论中我了解到您仍然无法使其按预期工作,但从问题的范围来看,我无法猜测问题可能是什么。我认为你应该看到正确的十六进制值提供 bytesToHex() 工作......也许扩展一点剩下的问题?
    • 没问题。我想要它的部分工作,其他无关紧要。无论如何,我感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2013-02-12
    • 1970-01-01
    • 2017-12-03
    • 2013-07-19
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多