Java 无法识别某些字节,将它们检测为 int?
Java can't recognize some bytes, it detects them as int?
private static byte [] header = {0x16,0x98,0x01,0x02,0x14,0x01,0x00,0x02,0x10,0x03,0x03};
我已经在 java 程序中初始化了我的字节数组之一。这里 java 显示一个错误, 0x98 需要在外部转换为字节。为什么 java 显示这个值是一个 int 值?以及如何告诉 java 这是一个字节?
byte
的范围从 -128 到 127 (=0x7F)。 (另见 https://www.w3schools.com/java/java_data_types.asp)
因此,您可以添加到字节数组的最大十六进制数是 0x7F。下一个值 0x80 可以存储到 int
(4 字节)或其他类似 short
(2 字节)
编辑:
如果要将 0x98 分配给字节变量,可以将其转换为字节:
byte x = (byte) 0x98;
要打印此无符号值,您可以使用 Byte.toUnsignedInt(x);
System.out.println(x); //will print -104
System.out.println(Byte.toUnsignedInt(x)); //will print 152
在 Java 中,假定数字的类型为 int
。所以当你写 0x98
时,它被假定为 int
152。如果你写 0x03
,它被假定为 int
3.
字节类型的值范围为 -128 ... 127。您可以毫无问题地将此范围内的任何 int
分配给限制为包含 byte
个变量的变量。
但是数字 152 超出了这个范围,所以你得到错误:
incompatible types: possible lossy conversion from int to byte
您可以编写 (byte)0x98
使其工作。
在 JShell 中:
jshell> 0x98
==> 152
jshell> (byte)0x98
==> -104
这个问题的简单答案是 0x98
不是一个字节。 Java 个字节是有符号的,范围从 -128 到 +127。 0x98
大于 +127。
但真正的解释是从 Java 根本没有字节文字 的事实开始的。每个整数文字表示一个 int
值或一个 long
值。
那么这是如何工作的呢?
byte b = 1;
之所以有效,是因为有一个特殊规则允许编译时间常量表达式类型为int
分配给 byte
当且仅当 值在 byte
范围内时。所以上面的工作,但是:
byte b2 = 0x98; // ERROR
被拒绝,因为0x98
超出了byte
的范围。
同样的规则也适用于数组初始值设定项。
private static byte [] header = {0x16,0x98,0x01,0x02,0x14,0x01,0x00,0x02,0x10,0x03,0x03};
我已经在 java 程序中初始化了我的字节数组之一。这里 java 显示一个错误, 0x98 需要在外部转换为字节。为什么 java 显示这个值是一个 int 值?以及如何告诉 java 这是一个字节?
byte
的范围从 -128 到 127 (=0x7F)。 (另见 https://www.w3schools.com/java/java_data_types.asp)
因此,您可以添加到字节数组的最大十六进制数是 0x7F。下一个值 0x80 可以存储到 int
(4 字节)或其他类似 short
(2 字节)
编辑:
如果要将 0x98 分配给字节变量,可以将其转换为字节:
byte x = (byte) 0x98;
要打印此无符号值,您可以使用 Byte.toUnsignedInt(x);
System.out.println(x); //will print -104
System.out.println(Byte.toUnsignedInt(x)); //will print 152
在 Java 中,假定数字的类型为 int
。所以当你写 0x98
时,它被假定为 int
152。如果你写 0x03
,它被假定为 int
3.
字节类型的值范围为 -128 ... 127。您可以毫无问题地将此范围内的任何 int
分配给限制为包含 byte
个变量的变量。
但是数字 152 超出了这个范围,所以你得到错误:
incompatible types: possible lossy conversion from int to byte
您可以编写 (byte)0x98
使其工作。
在 JShell 中:
jshell> 0x98
==> 152
jshell> (byte)0x98
==> -104
这个问题的简单答案是 0x98
不是一个字节。 Java 个字节是有符号的,范围从 -128 到 +127。 0x98
大于 +127。
但真正的解释是从 Java 根本没有字节文字 的事实开始的。每个整数文字表示一个 int
值或一个 long
值。
那么这是如何工作的呢?
byte b = 1;
之所以有效,是因为有一个特殊规则允许编译时间常量表达式类型为int
分配给 byte
当且仅当 值在 byte
范围内时。所以上面的工作,但是:
byte b2 = 0x98; // ERROR
被拒绝,因为0x98
超出了byte
的范围。
同样的规则也适用于数组初始值设定项。