在字节数组中表示数字(java编程)

时间:2010-05-19 19:51:54

标签: java arrays bytearray hex

我试图用两个字节的数组表示端口号9876(或十六进制的0x2694):

class foo {
     public static void main (String args[]) {
   byte[] sendData = new byte[1];

   sendData[0] = 0x26;
   sendData[1] = 0x94;
     }
}

但是我得到一个关于可能会失去精确度的警告:

foo.java:5: possible loss of precision
found   : int
required: byte
   sendData[1] = 0x94;
                 ^
1 error

如何在不丢失精度的情况下用双字节数组表示数字9876?

注意:我选择了@Björn的代码作为正确答案,但@glowcoder的代码也运行良好。这只是解决同一问题的另一种方法。谢谢大家!

7 个答案:

答案 0 :(得分:6)

您是否尝试过转换为字节? e.g。

sendData[1] = (byte)0x94;

答案 1 :(得分:3)

0x94是十进制的148,超出了java中的字节范围(-128到127)。 您可以执行以下操作之一:

1)强制转换将正常工作,因为它将保留二进制表示(没有有意义的位被截断为0x00到0xFF):

 sendData[1] = (byte)0x94; 

2)0x94作为有符号字节的二进制表示为-108(-0x6C),因此以下内容具有相同的效果:

sendData[1] = -0x6C; //or -108 in decimal

答案 2 :(得分:3)

Björn使用流程给出了一个很好的通用答案。你也可以使用java.nio.ByteBuffer做同样的事情,这会导致代码略少,你也可以控制输出的字节顺序(字节顺序)。

创建字节数组:

public static byte[] toByteArray(int bits) {
    ByteBuffer buf = ByteBuffer.allocate(4);
    buf.putInt(bits);
    return buf.array();
}

要扭转它:

public static int fromByteArray(byte[] b) {
    ByteBuffer buf = ByteBuffer.wrap(b);
    return buf.getInt();
}

答案 3 :(得分:1)

你必须转换为(byte)作为java中的默认数字类型是int,它大于byte。只要该值适合于字节,就可以进行转换。

答案 4 :(得分:1)

试试这个:

sendData[0] =(byte)0x26
sendData[1] =(byte)0x94

或者这个:

sendData[0] =(byte)38
sendData[1] =(byte)148

您必须将数据转换为字节,以便将其分配给一个字节!

这并不意味着你失去了精度,只需编写0x26就意味着一个int to Java编译器..

但请注意:一个字节的范围是-128到127,所以在0x94=148的情况下,它将在字节转换后表示为'-108',因此它在数学计算中无法正常工作。

答案 5 :(得分:1)

我的第一个答案是比特换档,但我想第二个想法是使用输出流可能更好,更容易理解。我通常会避免施法,但是如果你不打算使用通用的解决方案,我想这样就可以了。 :)

使用流,通用解决方案:

public byte[] intToByteArray(final int i) throws java.io.IOException {
    java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
    java.io.DataOutputStream d = new java.io.DataOutputStream(b);
    d.writeInt(i);
    d.flush();

    return b.toByteArray();
}

要扭转它:

public int byteArrayToInt(final byte[] b) throws IOException {
    java.io.ByteArrayInputStream ba = new java.io.ByteArrayInputStream(b);
    java.io.DataInputStream d = new java.io.DataInputStream(ba);

    return d.readInt();
}

答案 6 :(得分:0)

这是因为Java中的所有内容都已签名。 0x94(148)大于Byte.MAX_VALUE(2 ^ 7-1)。

您需要的是

public static byte[] intToByteArray(int value) {
    byte[] b = new byte[4];
    for (int i = 0; i < 4; i++) {
        int offset = (b.length - 1 - i) * 8;
        b[i] = (byte) ((value >>> offset) & 0xFF);
    }
    return b;
}