java无符号字节到流
我正在制作一个使用串口的应用程序。问题是,我控制的设备接收无符号字节范围,正如我看到的,java只接受有符号字节范围 我在谷歌上搜索过如何发送,但我只知道如何接收未签名字节 谢谢 编辑2:@durandal向我的代码建议的修复程序,以接收:java无符号字节到流,java,stream,Java,Stream,我正在制作一个使用串口的应用程序。问题是,我控制的设备接收无符号字节范围,正如我看到的,java只接受有符号字节范围 我在谷歌上搜索过如何发送,但我只知道如何接收未签名字节 谢谢 编辑2:@durandal向我的代码建议的修复程序,以接收: public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.DATA_A
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提供的正确十六进制值。。。也许可以延伸一点,看看还有什么问题?没问题。我想要的部分是有效的,另一部分无关紧要。无论如何,我感谢你的帮助