字符串或双精度字节

时间:2018-08-22 22:24:35

标签: java parsing byte

我有问题。我收到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[]中。

感谢您的帮助!

3 个答案:

答案 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”)