gpt4 book ai didi

Java - 为什么 readAllBytes 返回错误的字节码?

转载 作者:行者123 更新时间:2023-12-02 03:36:20 26 4
gpt4 key购买 nike

我遇到以下问题。我正在使用 Java 从文件创建字节数组。所以我执行以下操作:

byte[] myByteArray = Files.readAllBytes(filename);

但是,对于许多字节,它返回不正确/负值。

例如,如果我使用 JavaScript 进行测试,读取文件的每个字节,例如

    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 是我使用的程序中的一个函数,它给出特定位置的字节)。

这将返回正确的字节

所以我想知道,为什么 java 返回错误的代码?这与无符号值有关吗?

最佳答案

Java 不识别无符号字节。例如,无符号字节 255 将被打印为其签名版本 -1。但在内存中,实际值是相同的,表示为 255。

如果您想将字节转换为其无符号表示形式,可以使用按位 AND 运算符。

例如:

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 - 为什么 readAllBytes 返回错误的字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37411045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com