我有以下问题。我使用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是程序Im中使用的函数,它给出了特定位置的字节)。
返回正确的字节
所以我想知道,为什么java会返回错误的代码?这与无符号值有关吗?
答案 0 :(得分:2)
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()
。