我有以下代码:
byte[] someArray;
int a,b;
.
.
.
a=123; (result coming from calculations, always 0>=a<256)
b=91; (result coming from calculations, always 0>=b<256)
现在我想这样做
someArray[0]=a;
someArray[6]=b;
然而我试图转换为字节到此我失败了(我认为得到所有可能的错误消息)。还尝试了各种片段,指的是整数到字节的转换。
所以任何想法?
更新 这就是我得到 java.lang.NumberFormatException:无效int:“z”当我尝试这个 byteArray [0] = Integer.valueOf(String.valueOf(bani.substring(2, 3)),16).byteValue();
答案 0 :(得分:2)
答案 1 :(得分:2)
请注意,字节不是0
到255
!
它是-128
到+127
如果您意识到这一点,只需转换值
someArray[0] = (byte) a;
someArray[6] = (byte) b;
但是用一张支票围绕它,因为java会向你投射一切:
if(value <= Byte.MAX_VALUE && value >= Byte.MIN_VALUE) {
//do the cast
}
else {
//error handling
}
例如:
int i = 1300;
byte b = (byte) i;
//b will be 20 here
<强>更新强>
如果要调用NumberFormatException
,可以像这样解析值:
Byte.valueOf(Integer.toString(value));
请记住,字节是-128到127!
答案 2 :(得分:0)
首先, Java中没有未签名的数据类型。所有这些都是签名的 byte
是签名数据类型,可以保存-128 <= b => 127
范围内的值。其次,您需要从整数值中减去128,然后将其转换为byte
,只是为了获得byte
可以容纳的值:
someArray[0] = (byte) (a - 128);
someArray[6] = (byte) (b - 128);
答案 3 :(得分:0)
在Java中,整数基元类型(byte,short,int,long)始终是有符号的。
因此一个字节总是-128 ... 127
您可以使用强制转换
将int转换为字节int i = 120;
byte b = (byte) i;
如果您将200分配给i而不是120,则b变为-56,将b分配给i然后我将保留-56而不会再次变为200.
这是因为200的二进制表示为11001000,并将这些位放入一个字节然后将其解释为-56,再将其放入int中使其成为1111111111111111111111001000
答案 4 :(得分:0)
我不确定你为了内存使用而开发这个应用程序的程度:-)。我们在HBase API中有一个API Bytes.toBytes()
。您可以使用此API来获取许多类型的字节表示。也许你可以像Bytes.toInt()
一样使用它的反向来转换回来。据我所见,没有出现精确损失或价值变化的问题。
您可以从这里下载lib Hbase Lib。将lib中的hbase-0.94.jar添加到您的项目中。
答案 5 :(得分:0)
为了保证Byte.MAX_VALUE以上和Byte.MIN_VALUE以下的值没有错误,您可以使用bitwize操作来强加最大值:
public static byte toByte(int i){
return (byte) (i & 0x000000ff);
}
这将忽略前8位以上的所有位。从而为您提供任何int的有效字节(丢失24个最高位)。
如果你使用这个操作很多这个字节比比较和转换快得多。