java 无符号字节流
java unsigned byte to stream
我正在制作一个使用串行端口的应用程序。问题是我控制的设备接收无符号字节范围,正如我所见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
你把事情变得过于复杂 什么都没有。一个字节就是一个字节,没有signed/unsigned字节,只有字节。字节有signed/unsigned解释,但那是完全不同的概念。
你接收的代码有问题,当它接收到字节值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() 的 return 值作为 int!)和 [=26 的转换=]() 到字节 before 检查 -1 值。您应该在将 int 放入数组中而不是在 for.
中进行强制转换
我正在制作一个使用串行端口的应用程序。问题是我控制的设备接收无符号字节范围,正如我所见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
你把事情变得过于复杂 什么都没有。一个字节就是一个字节,没有signed/unsigned字节,只有字节。字节有signed/unsigned解释,但那是完全不同的概念。
你接收的代码有问题,当它接收到字节值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() 的 return 值作为 int!)和 [=26 的转换=]() 到字节 before 检查 -1 值。您应该在将 int 放入数组中而不是在 for.
中进行强制转换