0

我有以下代码:

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: Invalid int: "z"当我尝试这个byteArray[0]=Integer.valueOf(String.valueOf(bani.substring(2, 3)), 16).byteValue( );

4

6 回答 6

2

integer -> byte转换将导致编译错误,因为它可能会导致精度损失。文档。

但是,您可以进行显式转换:

someArray[0]=(byte)a;
于 2013-08-28T10:59:44.100 回答
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

更新:

如果你想调用 a NumberFormatException,你可以像这样解析值:

Byte.valueOf(Integer.toString(value));

请记住,字节是从 -128 到 127!

于 2013-08-28T10:59:47.180 回答
0

我不确定您为此开发的应用程序涉及内存使用的程度:-)。我们Bytes.toBytes()HBase API 中有一个 API。您可以使用此 API 来获取许多类型的字节表示。也许你可以使用它的反面Bytes.toInt()来转换回来。据我所知,没有看到精度损失或价值变化的问题。

您可以从此处下载库Hbase Lib .. 将库中的 hbase-0.94.jar 添加到您的项目中。

于 2013-08-28T11:13:16.590 回答
0

为了保证高于 Byte.MAX_VALUE 和低于 Byte.MIN_VALUE 的值没有错误,您可以使用 bitwize 操作来施加最大值:

public static byte toByte(int i){
    return (byte) (i & 0x000000ff);
}

这将忽略前 8 位以上的所有位。从而为您提供来自任何 int 的有效字节(丢失 24 个最高位)。

如果你大量使用这个操作这个字节比比较和转换快得多。

于 2013-08-28T13:34:51.283 回答
0

首先,Java 中没有无符号数据类型。它们都是有符号的, byte是有符号的数据类型,可以保存范围内的值-128 <= b => 127。其次,您需要从整数值中减去 128,然后将其转换为byte,只是为了得到一个byte可以容纳的值:

someArray[0] = (byte) (a - 128);
someArray[6] = (byte) (b - 128);
于 2013-08-28T10:59:57.570 回答
0

在 Java 中,整数原始类型(byte、short、int、long)总是有符号的。

因此一个字节总是-128...127

您可以使用强制转换将 int 转换为字节

int i = 120;

byte b = (byte) i;

如果将 200 分配给 i 而不是 120,则 b 变为 -56,将 b 分配回 i 则 i 将保持 -56 而不会再次变为 200。

这是因为 200 的二进制表示是 11001000,将这些位放入一个字节然后它被解释为 -56,将它再次放入一个 int 使其成为 1111111111111111111111001000

于 2013-08-28T11:05:35.530 回答