Java - 为什么 readAllBytes return 字节码不正确?
Java - why does readAllBytes return incorrect byte codes?
我有以下问题。我正在使用 Java 从文件创建字节数组。所以我做了以下事情:
byte[] myByteArray = Files.readAllBytes(filename);
但是,对于许多字节来说,它是 returning incorrect/negative 值。
例如,如果我使用 java 脚本进行测试,读取文件的每个字节,例如
function readbytes(s){
var f = new File(s);
var i,a,c;
var d = [];
if (f.isopen) {
c = f.eof;
for(i=0;i<c ;i++){
a = f.readbytes(1);
d.push(a);
}
f.close();
return d;
} else {
post("could not open file: " + s + "n");
}
}
(readbytes 是我使用的程序中的一个函数,它给出特定位置的字节)。
这 return 是正确的字节
所以我想知道,为什么 java return 代码不正确?这与无符号值有关吗?
Java 不知道无符号字节。例如,无符号字节 255 将被打印为它的有符号版本 -1。然而,在内存中,实际值将相同并表示为 255。
如果您想将一个字节转换为其无符号表示形式,您可以使用按位与运算符。
例如:
bytes[x] & 0xff
Java 在运行时不知道任何可能被推入 Java 虚拟机堆栈的操作数的字节。事实上,您应用于整数值的每个操作都会产生一个整数。这就是 ((byte)-1) & 0xff)
结果为整数且其值为 255 的原因。如果您想将该值存储回字节,则必须再次将其强制转换为 byte
,这当然是-1.
byte x = -1; // java is friendly enough to insert the implicit cast here
System.out.println(x); // -1
System.out.println(x & 0xff); // 255
byte y = (byte)(x & 0xff); // must add (byte) cast
System.out.println(y); // -1
另外请记住,从技术上讲,您看到的输出是不同的,但内容仍然相同,因为您始终可以从 Java 的有符号字节映射到它的无符号表示形式。理想情况下,您会使用 DataInputStream
之类的东西,它为您提供 int readUnsignedByte()
.
我有以下问题。我正在使用 Java 从文件创建字节数组。所以我做了以下事情:
byte[] myByteArray = Files.readAllBytes(filename);
但是,对于许多字节来说,它是 returning incorrect/negative 值。
例如,如果我使用 java 脚本进行测试,读取文件的每个字节,例如
function readbytes(s){
var f = new File(s);
var i,a,c;
var d = [];
if (f.isopen) {
c = f.eof;
for(i=0;i<c ;i++){
a = f.readbytes(1);
d.push(a);
}
f.close();
return d;
} else {
post("could not open file: " + s + "n");
}
}
(readbytes 是我使用的程序中的一个函数,它给出特定位置的字节)。
这 return 是正确的字节
所以我想知道,为什么 java return 代码不正确?这与无符号值有关吗?
Java 不知道无符号字节。例如,无符号字节 255 将被打印为它的有符号版本 -1。然而,在内存中,实际值将相同并表示为 255。
如果您想将一个字节转换为其无符号表示形式,您可以使用按位与运算符。
例如:
bytes[x] & 0xff
Java 在运行时不知道任何可能被推入 Java 虚拟机堆栈的操作数的字节。事实上,您应用于整数值的每个操作都会产生一个整数。这就是 ((byte)-1) & 0xff)
结果为整数且其值为 255 的原因。如果您想将该值存储回字节,则必须再次将其强制转换为 byte
,这当然是-1.
byte x = -1; // java is friendly enough to insert the implicit cast here
System.out.println(x); // -1
System.out.println(x & 0xff); // 255
byte y = (byte)(x & 0xff); // must add (byte) cast
System.out.println(y); // -1
另外请记住,从技术上讲,您看到的输出是不同的,但内容仍然相同,因为您始终可以从 Java 的有符号字节映射到它的无符号表示形式。理想情况下,您会使用 DataInputStream
之类的东西,它为您提供 int readUnsignedByte()
.