我使用RandomAccessFile描述符有这个方法:
public byte[] readByte(int number) {
try {
byte[] buffer = new byte[number];
raf.read(buffer);
return buffer;
} catch (IOException e) {
throw new ReadException("readBytes failed", e);
}
}
我正在尝试使用它来读取存储一系列无符号字节的二进制文件,但我得到负值。还试过:
public byte readByte() {
try {
return (byte) raf.readUnsignedByte();
} catch (IOException e) {
throw new ReadException("readByte failed", e);
}
}
public byte[] readByte(int number) {
byte[] sArray = new byte[number];
for (int i = 0; i < number; i++) {
sArray[i] = readByte();
}
return sArray;
}
在我看来,使用readUnsignedByte()应该只返回正值,但我最终会得到负值。
甚至强迫积极:
public byte[] readByte(int number) {
byte[] sArray = new byte[number];
for (int i = 0; i < number; i++) {
sArray[i] = (byte) (readByte() & 0xFF);
}
return sArray;
}
但是,我仍然得到负值。只有这样我可以使用正值然后在使用它们时转换它们(我使用这些数字作为另一个数组的索引):
palette[sArray[j] & 0xFF];
我做错了什么?
答案 0 :(得分:0)
您正在将readUnsignedByte
的结果投射到byte
- 所以如果结果是int
的255(例如),那么在投射到{-1
之后它是byte
{1}}。
byte
始终用Java签名 - 始终的范围为[-128, 127]
。你无能为力。
我建议您坚持使用第一个代码段(尽管使用read
的返回值来检查您是否真正阅读了预期的所有内容),然后使用& 0xff
获得积极的结果在你需要它时的价值。
另一种方法是使用short[]
,但这非常浪费 - 你每1字节的实际数据使用2个字节的内存。