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

Mar*_*rts 6 java arrays hex bytearray

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

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

   sendData[0] = 0x26;
   sendData[1] = 0x94;
     }
}
Run Code Online (Sandbox Code Playgroud)

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

foo.java:5: possible loss of precision
found   : int
required: byte
   sendData[1] = 0x94;
                 ^
1 error
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*new 6

你尝试过铸造一个字节吗?例如

sendData[1] = (byte)0x94;
Run Code Online (Sandbox Code Playgroud)


Bjö*_*örn 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();
}
Run Code Online (Sandbox Code Playgroud)

并扭转它:

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();
}
Run Code Online (Sandbox Code Playgroud)