我正在从硬件设备接收数据。我收到它作为一个字节数组。我想构建并存储一个String,它可以显示字节数组的数据。这就是我所拥有的:
byte[] buffer = new byte[BUFFER_SIZE];
bytes = mmInStream.read(buffer);
String[] str = new String[bytes];
StringBuffer readMessage = new StringBuffer();
for(int i=0; i<bytes; ++i){
str[i] = Integer.toHexString(buffer[i]);
while (str[i].length() < 8){ //standarize size
str[i] = '0' + str[i];
}
readMessage.append(str[i]);
}
我遇到的主要问题是,当我将字节转换为String时,我收到了意外的字节。我收到纯字节,所以我期望值范围从0x00到0xFF。但是,一些字节被转换为像0xFFFFFF09这样的字节。为什么会发生这种情况?
答案 0 :(得分:2)
您应该以这种方式将byte
转换为int
:
int byteAsInt = ((int)buffer[i]) & 0x000000FF;
str[i] = Integer.toHexString(byteAsInt);
答案 1 :(得分:1)
byte是有符号数据类型,因此0xFF为-1。当转换为更大的整数类型时,它仍然是-1,即16位和32位整数值的0xFFFF或0xFFFFFFFF。
修改:
如果要获取无符号值,请在分配更大的变量时使用0xFF按位AND(&amp;)。
答案 2 :(得分:0)
如果不运行代码,我认为您的问题存在于内循环中。
while(str [i] .length()&lt; 8){//标准尺寸
str [i] ='0'+ str [i];
}
您想要达到什么目标?打印0xFF
而不是FF
?在这种情况下,只需修改一行如下:
str[i] = "0x" + Integer.toHexString(buffer[i]);
并删除内循环。