我有问题。我收到double
val = 80.22。然后我将其拆分:
String[] arr=String.valueOf(val).split("\\.");
int[] intArr=new int[2];
intArr[0]=Integer.parseInt(arr[0]); // 80
intArr[1]=Integer.parseInt(arr[1]); // 22
现在,我需要将此值放入byte[]
中。但是我不需要将值放入byte[]
中,我需要像这样:0x80,0x22。
我尝试过的事情:
byte firstbyte = Byte.parseByte(arr[0], 16);
byte secondbyte = Byte.parseByte(arr[1], 16);
这可以正常工作,但只能达到80,然后我收到:
java.lang.NumberFormatException: Value out of range. Value:"80" Radix:16
但是我不明白。我需要最大为100的数字。
我尝试将其写入字符串= 0x80之类的字符串中,但是我不知道该如何将其放入byte[]
中。
感谢您的帮助!
答案 0 :(得分:1)
我很难理解这个问题,但是如果您要在字节数据类型中输入一个最大为100的数字,则只需编写:
byte firstbyte = (byte)intArr[0];
byte secondbyte = (byte)intArr[1];
因为0x80是一个十六进制值,其值等于十进制128,因此对于该数据类型而言太大。
答案 1 :(得分:0)
字节在Java中签名。 byte
中以十六进制表示的最大值是7F,因此80太大。不幸的是,没有parseUnsignedByte
。
解决方法是使用下一个更高范围的类型short
,然后将结果转换回byte
。
byte firstbyte = (byte) Short.parseShort(arr[0], 16);
byte secondbyte = (byte) Short.parseShort(arr[1], 16);
这会将“ 80”转换为-128
,但是字节表示形式正确:1000 0000
,或十六进制的80。
请注意,如果short
的值甚至超出了无符号字节的范围(至少为256或十六进制的“ 100”),那么它将默默地将该值截断为最低有效8位,即256-> 0、257-> 1,等等。
答案 2 :(得分:0)
字节最大值是2 ^ 7-1 = 127(十进制)
0x80是十进制128的十六进制表示形式。
十六进制从0到9,然后从A到F。
因此,dec中的80将为0x50。
只需避免在Byte.parseByte()中使用第二个参数,或者使用Byte.valueOf(“ 80”)