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().