我试图用两个字节的数组表示端口号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的代码也运行良好。这只是解决同一问题的另一种方法。谢谢大家!
答案 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;
}